Ist es möglich, ein File-Objekt aus InputStream zu erstellen

Lesezeit: 3 Minuten

Benutzer-Avatar
androidgalaxyman

Gibt es eine Möglichkeit, eine java.io.File Objekt aus einem java.io.InputStream ?

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

  • Meine Anforderung ist das Lesen der Datei aus einem RAR. Angenommen, ich versuche nicht, die temporäre Datei aus dem RAR zu schreiben, in RAR habe ich eine Datei, die ich nur lesen muss.

    – androidgalaxyman

    16. Juli 2012 um 10:24 Uhr


  • 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 du etwas anderes willst, was?

    – Benutzer207421

    16. Juli 2012 um 10:40 Uhr

  • Mögliches Duplikat von How to convert InputStream to virtual File

    – Paulo Oliveira

    14. Juni 2017 um 9:18 Uhr

Benutzer-Avatar
Tomasz Nurkiewicz

Sie müssen eine neue Datei erstellen und deren Inhalt kopieren InputStream zu dieser Datei:

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 benutze bequem IOUtils.copy() um das manuelle Kopieren von Streams zu vermeiden. Außerdem hat es eine eingebaute Pufferung.

  • IOUtils konnten in Android Studio nicht aufgelöst werden und der Link, auf den Sie verwiesen haben, ist ein 404.

    – Shahraiz T.

    24. November 2016 um 5:07 Uhr

  • org.apache.directory.studio:org.apache.commons.io musste als Abhängigkeit hinzugefügt werden. Mein Fehler. 🙂

    – Shahraiz T.

    24. November 2016 um 5:16 Uhr

  • Bitte schließen Sie den OutputStream korrekt, verwenden Sie einen Versuch mit Ressourcen oder IOUtils.closeQuietly. Ich weiß, es ist nur ein Beispiel, aber Anfänger werden es wörtlich kopieren.

    – Rafael Membrives

    30. August 2017 um 7:35 Uhr

  • Kann jemand File file = //… erklären? Wie initialisiere ich die Datei zuerst?

    – AlexLink

    1. Juni 2021 um 17:22 Uhr

In einer Zeile:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)

Seit Java 7 können Sie dies auch ohne Verwendung externer Bibliotheken in einer Zeile tun:

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

Siehe die API-Dokumente.

  • Wenn Sie dies mit Android verwenden, ist ein SDK von mindestens 26 erforderlich.

    – Neph

    27. Mai 2020 um 8:29 Uhr

  • das sollte die gewählte Antwort sein

    – Willi Mentzel

    26. Juli um 9:09 Uhr

Benutzer-Avatar
Shehan Simen

Erstellen Sie zuerst eine temporäre Datei mit org.apache.commons.io.

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

Benutzer-Avatar
MariuszS

Einfache Java 9-Lösung mit versuchen Sie es mit Ressourcen Block

public static void copyInputStreamToFile(InputStream input, File file) {  

    try (OutputStream output = new FileOutputStream(file)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream#transferTo ist seit Java 9 verfügbar.

  • Welcher Teil davon erfordert Java 11?

    – Maurice Nino

    28. September 2020 um 9:34 Uhr

  • @MauriceNino Mein Fehler, danke für einen Kommentar “try-with-resources – released in Java 7”

    – MariuszS

    28. September 2020 um 12:09 Uhr


Wenn Sie keine anderen Bibliotheken verwenden möchten, finden Sie hier eine einfache Funktion, um Daten aus einer zu kopieren InputStream zu einem 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 ganz einfach eine schreiben Inputstream in eine Datei mit FileOutputStream

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

  • Welcher Teil davon erfordert Java 11?

    – Maurice Nino

    28. September 2020 um 9:34 Uhr

  • @MauriceNino Mein Fehler, danke für einen Kommentar “try-with-resources – released in Java 7”

    – MariuszS

    28. September 2020 um 12:09 Uhr


Benutzer-Avatar
h3xStream

Wenn Sie Java Version 7 oder höher verwenden, können Sie verwenden Versuch-mit-Ressourcen richtig zu schließen FileOutputStream. Die folgende Codeverwendung IOUtils.copy() aus commons-io.

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

  • Müssen Sie den OutputStream nicht schließen? Wie in der Antwort von Tomasz N.

    – Trinity420

    24. September 2018 um 12:40 Uhr

  • @trinity420 Ressourcen, die in der angegeben sind try Initialisierungsteil werden automatisch geschlossen, wenn die try Block wird verlassen.

    – h3xStream

    26. September 2018 um 18:33 Uhr

  • gilt das für Android?

    – Gumuruh

    17. Dezember 2020 um 2:55 Uhr

  • @gumuruh Ja. stackoverflow.com/a/24290875/89769

    – h3xStream

    17. Dezember 2020 um 8:26 Uhr

1345490cookie-checkIst es möglich, ein File-Objekt aus InputStream zu erstellen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy