Konvertieren Sie InputStream in das File-Objekt in Java
-
Verwenden Sie Plain Java, um
InputStream
in dasFile
-Objekt zu konvertieren -
Verwenden Sie die
Files.copy()
-Methode, umInputStream
in dasFile
-Objekt in Java zu konvertieren -
Verwenden Sie die Methode
InputStream.transferTo()
, umInputStream
in dasFile
-Objekt in Java zu konvertieren -
Verwenden Sie die Apache Commons IO API, um
InputStream
in dasFile
-Objekt in Java zu konvertieren
Wir müssen häufig Dateien erstellen und ihnen Inhalte hinzufügen. Beispielsweise müssen wir die über das Netzwerk empfangenen Bytes oder String-Elemente in einer Datei speichern.
Die Daten liegen jeweils als InputStream
vor und müssen in eine Datei geschrieben werden. Das heutige Tutorial beschreibt, wie man InputStream
in das File
-Objekt in Java konvertiert.
Dazu schreiben wir je nach Java-Version verschiedene Beispielcodes mit unterschiedlichen Methoden, um InputStream
in das File
-Objekt umzuwandeln. Einige der Ansätze sind im Folgenden aufgeführt:
Verwenden Sie Plain Java, um InputStream
in das File
-Objekt zu konvertieren
Beispielcode:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class plainJava {
public static void main(String[] args) {
try {
InputStream inputStream = new FileInputStream(new File("./files/test.txt"));
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
File destinationFile = new File("./files/test-plainJava-output.txt");
OutputStream outputStream = new FileOutputStream(destinationFile);
outputStream.write(buffer);
} catch (FileNotFoundException exception) {
exception.printStackTrace();
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
Wir instanziieren den FileInputStream
im obigen Java-Programm, indem wir den Dateipfad angeben. Es wird eine FileNotFoundException
-Ausnahme generiert, wenn die Datei nicht existiert oder wir sie falsch geschrieben haben.
Wir verwenden FileInputStream
, um die Eingabebytes aus der angegebenen Datei abzurufen. Dann erstellen wir ein Array namens buffer
vom Typ byte
, wobei die Methode inputStream.available()
die Anzahl der Bytes angibt, die wir lesen können, bis der Aufruf read()
den Ausführungsfluss des Programms blockiert.
Danach instanziieren wir die Klasse File
, um die Datei test-plainJava-output.txt
zu erstellen, und speichern ihre Referenz in der Variablen destinationFile
. Als nächstes erstellen wir ein Objekt von FileOutputStream
, übergeben die Referenz der Zieldatei, die wir im vorherigen Schritt erstellt haben, und schreiben den byte
-Code.
Öffnen Sie nun die Dateien test.txt
und test-plainJava-output.txt
und sehen Sie, dass beide den gleichen Inhalt haben. Denken Sie daran, dass wir möglicherweise die IOException
erhalten, wenn wir beim Lesen oder Schreiben von Informationen Probleme haben.
Verwenden Sie die Files.copy()
-Methode, um InputStream
in das File
-Objekt in Java zu konvertieren
Beispielcode:
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;
public class filesCopy {
private static final String OUTPUT_FILE = "./files/test_filesCopy-output.txt";
public static void main(String[] args) {
URI u = URI.create("https://www.google.com/");
try (InputStream inputStream = u.toURL().openStream()) {
// Java 1.7 onwards
Files.copy(inputStream, Paths.get(OUTPUT_FILE));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Wir können diesen Ansatz in Java 7 oder höher verwenden. Im obigen Code Fence verwenden wir Files.copy()
von Java NIO API, das verwendet wird, um das InputStream
-Objekt in das File
-Objekt zu kopieren, wie oben gezeigt.
Im Programm filesCopy
erstellen wir zuerst ein Objekt vom Typ String, das den Pfad für die Ausgabedatei enthält.
In der main()
-Methode erstellen wir mit der create()
-Methode ein URI
-Objekt und speichern dessen Referenz in der u
-Variablen, die im nächsten Schritt verwendet wird. Denken Sie daran, dass wir create()
verwenden, wenn wir sicher sind, dass der angegebene String-Wert als URI
-Objekt geparst wird; andernfalls würde es als Fehler des Programmierers betrachtet werden.
Als nächstes verwenden wir das URI
-Objekt u
, um die toURL()
-Methode aufzurufen, um eine URL aus diesem URI
zu erstellen, und verwenden die openStream()
-Methode, um das java.io.InputSteam
-Objekt zu erhalten. Danach verwenden wir die Methode Files.copy()
, die zwei Parameter übernimmt, das inputStream
-Objekt und einen Pfad
der Datei, in die wir die Daten kopieren wollen.
Nun sehen wir die geparsten Daten in unserer Ausgabedatei, in unserem Fall test_filesCopy-output.txt
. Wir verwenden den try-catch
-Block, um die Ausnahme zu behandeln, falls eine auftritt; andernfalls beendet das Programm die Ausführung.
Verwenden Sie die Methode InputStream.transferTo()
, um InputStream
in das File
-Objekt in Java zu konvertieren
Beispielcode:
import java.io.*;
import java.net.URI;
public class inputStreamTransferTo {
public static void main(String[] args) {
URI u = URI.create("https://www.google.com/");
try (InputStream inputStream = u.toURL().openStream()) {
File outputFile = new File("./files/test_transferTo-output.txt");
OutputStream outputStream = new FileOutputStream(outputFile, false);
inputStream.transferTo(outputStream); // Java 9
} catch (IOException e) {
e.printStackTrace();
}
}
}
Wir können diesen Ansatz verwenden, wenn wir Java 9 oder höher haben. Dieses Codebeispiel ähnelt dem vorherigen, bei dem wir die Methode Files.copy()
verwendet haben, mit Ausnahme einiger Unterschiede im Block try
.
Hier erstellen wir ein Objekt der Klasse File
, indem wir die Ausgabedatei angeben, in unserem Fall test_transferTo-output.txt
. Dann verwenden wir dieses File
-Objekt, um die FileOutputStream
-Klasse zu instanziieren, die wir verwenden werden, um Daten in unsere Ausgabedatei (test_transferTo_output.txt
) zu schreiben.
Schließlich verwenden wir die Methode inputStream.transferTo()
, die einen Ausgabestream als Parameter nimmt und inputStream
direkt in den angegebenen outputSteam
kopiert. Jetzt haben Sie die geparsten Daten in der Ausgabedatei test_transferTo_output.txt
.
Wir haben diesen Code auch in den try-catch
-Block eingeschlossen, um die Beendigung des Programms zu vermeiden.
Verwenden Sie die Apache Commons IO API, um InputStream
in das File
-Objekt in Java zu konvertieren
Beispielcode:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.apache.commons.io.FileUtils;
public class apacheCommons {
public static void main(String[] args) throws IOException {
URI u = URI.create("https://www.google.com/");
try (InputStream inputStream = u.toURL().openStream()) {
File outputFile = new File("./files/test_apache_output.txt");
// commons-io
FileUtils.copyInputStreamToFile(inputStream, outputFile);
}
}
}
Dieser Beispielcode ähnelt den vorherigen. Wir erstellen ein URI
-Objekt, um toURL
aufzurufen, das über dieses URI
-Objekt eine URL erstellt, das java.io.InputStream
-Objekt mit der openStream()
-Methode abruft und die File
instanziiert. Klasse, die auf einen Pfad für unsere Ausgabedatei zeigt, die hier test_apache_output.txt
ist.
Wir verwenden jedoch die API Apache Commons IO, um den Eingabestrom in das Dateiobjekt in Java zu konvertieren. Diese API ist sehr praktisch und bietet verschiedene Funktionalitäten, um verschiedene Eingabe-/Ausgabevorgänge für Dateien durchzuführen.
Um diese Bibliothek zu verwenden, müssen wir zuerst die Abhängigkeit commons-io
in der Datei pom.xml
wie folgt hinzufügen:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
Dann können wir die Methode copyInputStreamToFile()
verwenden, um Bytes aus einem Eingabestrom zu lesen und sie in die angegebene Datei zu kopieren. Jetzt können Sie die geparsten Daten in der Datei test_apache_output.txt
sehen, die eine Ausgabedatei ist.