Apakah ada cara untuk membuat java.io.Fileobjek 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.Fileobjek 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 InputStreamke 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 InputStreamke 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 Inputstreamke 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);
}
}
tryinisialisasi secara otomatis ditutup ketika tryblok keluar.