InputStream'den bir File nesnesi oluşturmak mümkün mü


124

Bir java.io.Filenesneden bir nesne yaratmanın bir yolu var mı java.io.InputStream?

Benim ihtiyacım, Dosyayı bir RAR'dan okumak. Geçici bir Dosya yazmaya çalışmıyorum, RAR arşivinin içinde okumaya çalıştığım bir dosyam var.


1
Benim ihtiyacım Dosyayı bir RAR'dan okumak. Geçici Dosyayı RAR'dan yazmaya çalışmadığımı varsayın, RAR'da bir Dosyam var, sadece okumam gerekiyor.
androidgalaxyman

Soruyu anlamıyorum. Lütfen açıkla. InputStream'den oriinal Dosyayı istiyorsanız, bir tane yoktu: bir Dosya değil, bir RAR dosyası okuyorsunuz. Başka bir şey istiyorsan ne?
Marquis of Lorne

Yanıtlar:


90

Yeni dosya oluşturmanız ve içeriğini InputStreamo dosyaya kopyalamanız gerekir :

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()Akışların manuel olarak kopyalanmasını önlemek için uygun kullanıyorum . Ayrıca yerleşik arabelleğe alma özelliğine sahiptir.


3
Android Studio'da IOUtils çözülemedi ve başvurduğunuz bağlantı 404.
Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.io'nun bağımlılık olarak eklenmesi gerekiyordu. Benim hatam. :)
Shahraiz T.

7
Lütfen OutputStream'i doğru şekilde kapatın, kaynaklarla veya IOUtils.closeQuietly ile deneyin. Bunun sadece bir örnek olduğunu biliyorum ama yeni başlayanlar onu tam anlamıyla kopyalayacak.
Rafael Membrives

59

Tek satırda:

FileUtils.copyInputStreamToFile(inputStream, file);

(Org.apache.commons.io)


29

Önce bir geçici dosya oluşturun.

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

Lütfen IOUtils paket adını ekleyin
Ridhuvarshan

org.apache.commons.io
Shehan Simen

Ayrıca org.apache.axis2.util'de kopya işlevi için üçüncü bir parametre ile birlikte bulunur. İşlevsellik orada da çalışıyor. Ne kullanacağınıza dair herhangi bir karşılaştırma var mı?
Ridhuvarshan

27

Java 7'den beri, herhangi bir harici kitaplık kullanmadan bile tek satırda yapabilirsiniz:

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

API belgelerine bakın .


2
Bunu Android ile kullanırsanız en az 26 SDK gerekir.
Neph

3

Başka bir kitaplık kullanmak istemiyorsanız, burada dönüştürmek InputStreamiçin basit bir işlev var 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);
    }
}

Artık şunu kullanarak kolayca bir Inputstreamdosyaya yazabilirsiniz FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

Kaynak bloğu ile deneyin kolay Java 11 çözümü

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'dan beri mevcuttur.


0

Java sürüm 7 veya daha yüksek kullanıyorsanız, kullanabileceğiniz deneyin-ile-kaynaklar düzgün yakın FileOutputStream. Aşağıdaki kod IOUtils.copy(), commons-io'dan kullanılır .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

OutputStream'i kapatmanıza gerek yok mu? Tomasz N.'nin
cevabındaki gibi

3
@ trinity420 tryBaşlatma bölümünde belirtilen kaynaklar , trybloktan çıkıldığında otomatik olarak kapatılır .
h3xStream
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.