Можно ли создать объект File из InputStream


124

Есть ли способ создать java.io.Fileобъект из java.io.InputStream?

Мое требование - прочитать файл из RAR. Я не пытаюсь записать временный файл, у меня есть файл в архиве RAR, который я пытаюсь прочитать.


1
Мое требование - прочитать файл из RAR. Предположим, я не пытаюсь записать временный файл из RAR, внутри RAR у меня есть файл, мне просто нужно прочитать.
androidgalaxyman

Я не понимаю вопроса. Просьба уточнить. Если вы хотите получить исходный файл из InputStream, его не было: вы читаете файл RAR, а не файл. Если вы хотите чего-то еще, что?
Marquis of Lorne

Ответы:


90

Вам нужно создать новый файл и скопировать содержимое из InputStreamэтого файла:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

Я использую удобно, IOUtils.copy()чтобы избежать ручного копирования потоков. Также есть встроенная буферизация.


3
Не удалось разрешить IOUtils в Android Studio, и ссылка, на которую вы ссылались, - 404.
Шахрайз Т.

3
org.apache.directory.studio:org.apache.commons.io необходимо добавить в качестве зависимости. Виноват. :)
Shahraiz T.

7
Пожалуйста, закройте правильно OutputStream, попробуйте с ресурсами или IOUtils.closeQuietly. Я знаю, что это всего лишь пример, но новички буквально скопируют его.
Rafael Membrives


29

Сначала создайте временный файл.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

Пожалуйста, укажите название пакета IOUtils
Ридхуваршан

org.apache.commons.io
Шехан Симен

Он также существует в org.apache.axis2.util с третьим параметром для функции копирования. Функционал там тоже работает. Любые сравнения того, что использовать?
Ридхуваршан

26

Начиная с Java 7, вы можете делать это в одну строку даже без использования каких-либо внешних библиотек:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

См. Документацию по API .


2
Если вы используете это с Android, требуется минимальный SDK 26.
Неф

3

Если вы не хотите использовать другую библиотеку, здесь простая функция для преобразования InputStreamв OutputStream.

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Теперь вы можете легко записать Inputstreamв файл, используя FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

Решение Easy Java 11 с блоком try with resources

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream # transferTo доступен начиная с Java 9.


0

Если вы используете Java версии 7 или выше, вы можете использовать try-with-resources, чтобы правильно закрыть файл FileOutputStream. Следующее использование кода IOUtils.copy()из Викисклада гипергликемии .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

Разве вам не нужно закрывать OutputStream? Как в ответе Tomasz N.
trinity420

3
@ trinity420 Ресурсы, указанные в части tryинициализации, автоматически закрываются при tryвыходе из блока.
h3xStream
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.