Чи можливо створити об'єкт File з InputStream


122

Чи є якийсь спосіб створити java.io.Fileоб’єкт із java.io.InputStream?

Моєю вимогою є читання Файлу з RAR. Я не намагаюся написати тимчасовий файл, у мене є файл всередині архіву RAR, який я намагаюся прочитати.


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

Я не розумію питання. Поясніть будь ласка. Якщо ви хочете початковий файл з InputStream, його не було: ви читаєте файл RAR, а не файл. Якщо ви хочете чогось іншого, що?
Маркіз Лорн

Відповіді:


88

Вам потрібно створити новий файл і скопіювати вміст з 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.
Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.io потрібно додати як залежність. Моє ліжко. :)
Шахраїз Т.

7
Будь ласка, закрийте правильно OutputStream, використовуйте спробу з ресурсами або IOUtils.closeQuietly. Я знаю, що це лише приклад, але початківці копіюють це буквально.
Рафаель Мембрівс


29

Спершу створіть тимчасовий файл.

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

Будь ласка, включіть назву пакета IOUtils
Ridhuvarshan

org.apache.commons.io
Шеха Сайма

Він також існує в org.apache.axis2.util з третім параметром для функції копіювання. Функціонал працює і там. Будь-які порівняння, що використовувати?
Ridhuvarshan

26

Оскільки Java 7, ви можете це робити в одному рядку навіть без використання зовнішніх бібліотек:

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

Див. Документи API .


2
Якщо ви користуєтесь цим в Android, потрібно мінімум 26 SDK.
Неф

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

Просте рішення Java 11 із спробою з блоком ресурсів

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 або новішої, ви можете скористатися пробними ресурсами, щоб правильно закрити FileOutputStream. Наступний код використовується IOUtils.copy()від commons-io .

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

Вам не потрібно закривати OutputStream? Як у відповіді Томаша Н.
trinity420

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