Есть ли способ создать java.io.File
объект из java.io.InputStream
?
Мое требование - прочитать файл из RAR. Я не пытаюсь записать временный файл, у меня есть файл в архиве RAR, который я пытаюсь прочитать.
Есть ли способ создать java.io.File
объект из java.io.InputStream
?
Мое требование - прочитать файл из RAR. Я не пытаюсь записать временный файл, у меня есть файл в архиве RAR, который я пытаюсь прочитать.
Ответы:
Вам нужно создать новый файл и скопировать содержимое из 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()
чтобы избежать ручного копирования потоков. Также есть встроенная буферизация.
В одной строке:
FileUtils.copyInputStreamToFile(inputStream, file);
(Org.apache.commons.io)
Сначала создайте временный файл.
File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Начиная с Java 7, вы можете делать это в одну строку даже без использования каких-либо внешних библиотек:
Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);
См. Документацию по API .
Если вы не хотите использовать другую библиотеку, здесь простая функция для преобразования 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();
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.
Если вы используете 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);
}
}
try
инициализации, автоматически закрываются при try
выходе из блока.