Ist es möglich, ein Dateiobjekt aus InputStream zu erstellen?

121

Gibt es eine Möglichkeit, ein java.io.FileObjekt aus einem zu erstellen java.io.InputStream?

Meine Anforderung ist das Lesen der Datei von einem RAR. Ich versuche nicht, eine temporäre Datei zu schreiben. Ich habe eine Datei im RAR-Archiv, die ich lesen möchte.

androidgalaxyman
quelle
1
Meine Anforderung ist das Lesen der Datei von einem RAR. Angenommen, ich versuche nicht, die temporäre Datei aus der RAR zu schreiben. In der RAR habe ich eine Datei, ich muss sie nur lesen.
Android Galaxyman
Ich verstehe die Frage nicht. Bitte klären Sie. Wenn Sie die Originaldatei aus dem InputStream möchten, gab es keine: Sie lesen eine RAR-Datei, keine Datei. Wenn Sie etwas anderes wollen, was?
Marquis von Lorne
Mögliches Duplikat von Wie man InputStream in eine virtuelle Datei konvertiert
Paulo Oliveira

Antworten:

87

Sie müssen eine neue Datei erstellen und Inhalte aus InputStreamdieser Datei kopieren :

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

Ich verwende bequem IOUtils.copy(), um das manuelle Kopieren von Streams zu vermeiden. Es hat auch eine integrierte Pufferung.

Tomasz Nurkiewicz
quelle
3
IOUtils in Android Studio konnte nicht aufgelöst werden und der Link, auf den Sie verwiesen haben, ist 404.
Shahraiz T.
3
org.apache.directory.studio:org.apache.commons.io musste als Abhängigkeit hinzugefügt werden. Mein Fehler. :)
Shahraiz T.
7
Bitte schließen Sie den OutputStream korrekt, versuchen Sie es mit Ressourcen oder IOUtils.closeQuietly. Ich weiß, dass es nur ein Beispiel ist, aber Anfänger werden es buchstäblich kopieren.
Rafael Membrives
59

In einer Zeile:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)

Victor Petit
quelle
28

Erstellen Sie zuerst eine temporäre Datei.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
Shehan Simen
quelle
Bitte geben Sie den Paketnamen von IOUtils
Ridhuvarshan
org.apache.commons.io
Shehan Simen
Es existiert auch in org.apache.axis2.util mit einem dritten Parameter für die Kopierfunktion. Die Funktionalität funktioniert auch dort. Irgendwelche Vergleiche, was zu verwenden ist?
Ridhuvarshan
26

Seit Java 7 können Sie dies in einer Zeile tun, auch ohne externe Bibliotheken zu verwenden:

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

Siehe die API-Dokumente .

Niere
quelle
1
Wenn Sie dies mit Android verwenden, ist ein Mindest-SDK von 26 erforderlich.
Neph
3

Wenn Sie nicht verwenden , um andere Bibliothek wollen, hier ist eine einfache Funktion konvertieren InputStreamzu 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);
    }
}

Jetzt können Sie einfach eine InputstreamDatei mit FileOutputStream- schreiben.

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();
Nabin Bhandari
quelle
1

Einfache Java 11 - Lösung mit Versuch mit Ressourcen blockieren

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 ist seit Java 9 verfügbar.

MariuszS
quelle
0

Wenn Sie Java Version 7 oder höher verwenden, können Sie Try-with-Resources verwenden, um das Programm ordnungsgemäß zu schließen FileOutputStream. Der folgende Code wird IOUtils.copy()von commons-io verwendet .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  
h3xStream
quelle
Müssen Sie den OutputStream nicht schließen? Wie in der Antwort von Tomasz N.
Trinity420
3
@ trinity420 Die im tryInitialisierungsteil angegebenen Ressourcen werden beim tryVerlassen des Blocks automatisch geschlossen .
h3xStream