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

124

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

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

androidgalaxyman
источник
1
Мое требование - прочитать файл из RAR. Предположим, я не пытаюсь записать временный файл из RAR, внутри RAR у меня есть файл, мне просто нужно прочитать.
androidgalaxyman
Я не понимаю вопроса. Просьба уточнить. Если вы хотите получить исходный файл из InputStream, его не было: вы читаете файл RAR, а не файл. Если вы хотите чего-то еще, что?
Marquis of Lorne
Возможный дубликат « Как преобразовать InputStream в виртуальный файл»
Пауло Оливейра,

Ответы:

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
59

В одной строке:

FileUtils.copyInputStreamToFile(inputStream, file);

(Org.apache.commons.io)

Виктор Пети
источник
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.

MariuszS
источник
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);
    }
}  
h3xStream
источник
Разве вам не нужно закрывать OutputStream? Как в ответе Tomasz N.
trinity420
3
@ trinity420 Ресурсы, указанные в части tryинициализации, автоматически закрываются при tryвыходе из блока.
h3xStream