Apakah ada cara untuk membuat java.io.File
objek dari sebuah java.io.InputStream
?
Persyaratan saya adalah membaca File dari RAR. Saya tidak mencoba menulis File sementara, saya memiliki file di dalam arsip RAR yang saya coba baca.
Apakah ada cara untuk membuat java.io.File
objek dari sebuah java.io.InputStream
?
Persyaratan saya adalah membaca File dari RAR. Saya tidak mencoba menulis File sementara, saya memiliki file di dalam arsip RAR yang saya coba baca.
Jawaban:
Anda perlu membuat file baru dan menyalin konten dari InputStream
ke file itu:
File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
// handle exception here
} catch (IOException e) {
// handle exception here
}
Saya menggunakan kemudahan IOUtils.copy()
untuk menghindari penyalinan aliran manual. Juga memiliki buffering bawaan.
Dalam satu baris:
FileUtils.copyInputStreamToFile(inputStream, file);
(org.apache.commons.io)
Buat file temp dulu.
File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Sejak Java 7, Anda dapat melakukannya dalam satu baris bahkan tanpa menggunakan pustaka eksternal:
Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);
Lihat dokumen API .
Jika Anda tidak ingin menggunakan perpustakaan lain, di sini adalah fungsi sederhana untuk mengkonversi InputStream
ke 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);
}
}
Sekarang Anda dapat dengan mudah menulis Inputstream
ke dalam file dengan menggunakan 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 tersedia sejak Java 9.
Jika Anda menggunakan Java versi 7 atau lebih tinggi, Anda dapat menggunakan try-with-resources untuk menutup file FileOutputStream
. Kode berikut digunakan IOUtils.copy()
dari commons-io .
public void copyToFile(InputStream inputStream, File file) throws IOException {
try(OutputStream outputStream = new FileOutputStream(file)) {
IOUtils.copy(inputStream, outputStream);
}
}
try
inisialisasi secara otomatis ditutup ketika try
blok keluar.