it-roy-ru.com

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

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

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

85
androidgalaxyman

Вам нужно создать новый файл и скопировать содержимое из 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() , чтобы избежать ручного копирования потоков. Также он имеет встроенную буферизацию.

67
Tomasz Nurkiewicz

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

FileUtils.copyInputStreamToFile(inputStream, file);

(Org.Apache.commons.io)

42
Victor Petit

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

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

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

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

Смотрите Документы API .

6
kidney

Если вы не хотите использовать другую библиотеку, вот простая функция для преобразования 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
Nabin Bhandari

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

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