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.


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

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.


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)


29

Buat file temp dulu.

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

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 .


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();

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.


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);
    }
}  

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.