Apakah mungkin untuk membuat objek File dari InputStream

124

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.

androidgalaxyman
sumber
1
persyaratan saya adalah membaca File dari RAR. Asumsikan saya tidak mencoba untuk menulis File sementara dari RAR, di dalam RAR saya memiliki File, hanya saya perlu membaca.
androidgalaxyman
Saya tidak mengerti pertanyaannya. Mohon klarifikasi. Jika Anda menginginkan File asli dari InputStream, tidak ada satu pun: Anda membaca file RAR, bukan File. Jika Anda menginginkan yang lain, apa?
Marquis dari Lorne
Kemungkinan duplikat dari Cara mengonversi InputStream ke File virtual
Paulo Oliveira

Jawaban:

90

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.

Tomasz Nurkiewicz
sumber
3
Tidak dapat menyelesaikan IOUtils di Android Studio dan link yang Anda referensikan adalah 404.
Shahraiz T.Nov
3
org.apache.directory.studio:org.apache.commons.io perlu ditambahkan sebagai ketergantungan. Salahku. :)
Shahraiz T.
7
Tutup OutputStream dengan benar, gunakan percobaan dengan sumber daya atau IOUtils.closeQuietly. Saya tahu ini hanya sebuah contoh tetapi pemula akan menyalinnya secara harfiah.
Rafael Membrives
59

Dalam satu baris:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)

Victor Petit
sumber
29

Buat file temp dulu.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Shehan Simen
sumber
Harap Sertakan nama paket IOUtils
Ridhuvarshan
org.apache.commons.io
Shehan Simen
Itu juga ada di org.apache.axis2.util dengan parameter ketiga untuk fungsi salin. Fungsinya juga berfungsi di sana. Ada perbandingan tentang apa yang harus digunakan?
Ridhuvarshan
27

Sejak Java 7, Anda dapat melakukannya dalam satu baris bahkan tanpa menggunakan pustaka eksternal:

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

Lihat dokumen API .

ginjal
sumber
2
Jika Anda menggunakan ini dengan Android, diperlukan SDK minimal 26.
Nef
3

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();
Nabin Bhandari
sumber
1

Solusi Java 11 yang mudah dengan mencoba dengan blok sumber daya

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.

MariuszS
sumber
0

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);
    }
}  
h3xStream
sumber
Apakah Anda tidak perlu menutup OutputStream? Seperti dalam jawaban dari Tomasz N.
trinity420
3
@ trinity420 Sumber daya yang ditentukan di bagian tryinisialisasi secara otomatis ditutup ketika tryblok keluar.
h3xStream