Java - Dateien und E / A.
Das Paket java.io enthält nahezu jede Klasse, die Sie möglicherweise jemals für die Eingabe und Ausgabe (E / A) in Java benötigen. Alle diese Streams repräsentieren eine Eingabequelle und ein Ausgabeziel. Der Stream im Paket java.io unterstützt viele Daten wie Grundelemente, Objekte, lokalisierte Zeichen usw.
Strom
Ein Stream kann als eine Folge von Daten definiert werden. Es gibt zwei Arten von Streams -
InPutStream - Der InputStream wird zum Lesen von Daten aus einer Quelle verwendet.
OutPutStream - Der OutputStream wird zum Schreiben von Daten in ein Ziel verwendet.
Java bietet eine starke, aber flexible Unterstützung für E / A in Bezug auf Dateien und Netzwerke. Dieses Tutorial behandelt jedoch sehr grundlegende Funktionen in Bezug auf Streams und E / A. Wir werden die am häufigsten verwendeten Beispiele einzeln sehen -
Byte-Streams
Java-Byte-Streams werden verwendet, um die Eingabe und Ausgabe von 8-Bit-Bytes durchzuführen. Es gibt zwar viele Klassen, die sich auf Byte-Streams beziehen, aber die am häufigsten verwendeten Klassen sind:FileInputStream und FileOutputStream. Das folgende Beispiel verwendet diese beiden Klassen, um eine Eingabedatei in eine Ausgabedatei zu kopieren.
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Jetzt haben wir eine Datei input.txt mit folgendem Inhalt -
This is test for copy file.
Kompilieren Sie als nächsten Schritt das obige Programm und führen Sie es aus. Dadurch wird die Datei output.txt mit demselben Inhalt wie in input.txt erstellt. Fügen wir also den obigen Code in die Datei CopyFile.java ein und gehen Sie wie folgt vor:
$javac CopyFile.java
$java CopyFile
Charakter-Streams
Java Byte Streams werden verwendet, um die Eingabe und Ausgabe von 8-Bit-Bytes durchzuführen, während Java CharacterStreams werden verwendet, um die Ein- und Ausgabe für 16-Bit-Unicode durchzuführen. Es gibt zwar viele Klassen, die sich auf Zeichenströme beziehen, aber die am häufigsten verwendeten Klassen sind:FileReader und FileWriter. Obwohl FileReader intern FileInputStream und FileWriter FileOutputStream verwendet, besteht der Hauptunterschied darin, dass FileReader jeweils zwei Bytes liest und FileWriter jeweils zwei Bytes schreibt.
Wir können das obige Beispiel neu schreiben, das diese beiden Klassen verwendet, um eine Eingabedatei (mit Unicode-Zeichen) in eine Ausgabedatei zu kopieren.
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Jetzt haben wir eine Datei input.txt mit folgendem Inhalt -
This is test for copy file.
Kompilieren Sie als nächsten Schritt das obige Programm und führen Sie es aus. Dadurch wird die Datei output.txt mit demselben Inhalt wie in input.txt erstellt. Fügen wir also den obigen Code in die Datei CopyFile.java ein und gehen Sie wie folgt vor:
$javac CopyFile.java
$java CopyFile
Standard-Streams
Alle Programmiersprachen unterstützen Standard-E / A, bei denen das Programm des Benutzers Eingaben von einer Tastatur entgegennehmen und dann eine Ausgabe auf dem Computerbildschirm erzeugen kann. Wenn Sie mit den Programmiersprachen C oder C ++ vertraut sind, müssen Sie drei Standardgeräte STDIN, STDOUT und STDERR kennen. In ähnlicher Weise bietet Java die folgenden drei Standard-Streams:
Standard Input - Dies wird verwendet, um die Daten dem Benutzerprogramm zuzuführen. In der Regel wird eine Tastatur als Standardeingabestream verwendet und als dargestellt System.in.
Standard Output - Dies wird verwendet, um die vom Benutzerprogramm erzeugten Daten auszugeben, und normalerweise wird ein Computerbildschirm für den Standardausgabestream verwendet und als dargestellt System.out.
Standard Error - Dies wird verwendet, um die vom Benutzerprogramm erzeugten Fehlerdaten auszugeben. In der Regel wird ein Computerbildschirm für den Standardfehlerstrom verwendet und als dargestellt System.err.
Es folgt ein einfaches Programm, das erstellt InputStreamReader Standard-Eingabestream lesen, bis der Benutzer ein "q" eingibt -
Example
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}
Lassen Sie uns den obigen Code in der Datei ReadConsole.java behalten und versuchen, ihn wie im folgenden Programm gezeigt zu kompilieren und auszuführen. Dieses Programm liest und gibt das gleiche Zeichen weiter aus, bis wir 'q' drücken -
$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q
Dateien lesen und schreiben
Wie zuvor beschrieben, kann ein Stream als eine Folge von Daten definiert werden. DasInputStream wird verwendet, um Daten aus einer Quelle zu lesen und die OutputStream wird zum Schreiben von Daten an ein Ziel verwendet.
Hier ist eine Hierarchie von Klassen, die sich mit Eingabe- und Ausgabestreams befassen.
Die zwei wichtigen Ströme sind FileInputStream und FileOutputStream, die in diesem Tutorial besprochen werden.
FileInputStream
Dieser Stream wird zum Lesen von Daten aus den Dateien verwendet. Objekte können mit dem Schlüsselwort erstellt werdennew und es gibt verschiedene Arten von Konstruktoren.
Der folgende Konstruktor verwendet einen Dateinamen als Zeichenfolge, um ein Eingabestreamobjekt zum Lesen der Datei zu erstellen.
InputStream f = new FileInputStream("C:/java/hello");
Der folgende Konstruktor verwendet ein Dateiobjekt, um ein Eingabestreamobjekt zum Lesen der Datei zu erstellen. Zuerst erstellen wir ein Dateiobjekt mit der File () -Methode wie folgt:
File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);
Sobald Sie das InputStream- Objekt zur Hand haben, gibt es eine Liste von Hilfsmethoden, die zum Lesen zum Streamen oder für andere Vorgänge im Stream verwendet werden können.
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | public void close() throws IOException{} Diese Methode schließt den Dateiausgabestream. Gibt alle mit der Datei verknüpften Systemressourcen frei. Löst eine IOException aus. |
2 | protected void finalize()throws IOException {} Diese Methode bereinigt die Verbindung zur Datei. Stellt sicher, dass die Methode close dieses Dateiausgabestreams aufgerufen wird, wenn keine Verweise mehr auf diesen Stream vorhanden sind. Löst eine IOException aus. |
3 | public int read(int r)throws IOException{} Diese Methode liest das angegebene Datenbyte aus dem InputStream. Gibt ein int zurück. Gibt das nächste Datenbyte zurück und -1 wird zurückgegeben, wenn es das Ende der Datei ist. |
4 | public int read(byte[] r) throws IOException{} Diese Methode liest r.length Bytes aus dem Eingabestream in ein Array. Gibt die Gesamtzahl der gelesenen Bytes zurück. Wenn es das Ende der Datei ist, wird -1 zurückgegeben. |
5 | public int available() throws IOException{} Gibt die Anzahl der Bytes an, die aus diesem Dateieingabestream gelesen werden können. Gibt ein int zurück. |
Es stehen weitere wichtige Eingabestreams zur Verfügung. Weitere Informationen finden Sie unter den folgenden Links:
ByteArrayInputStream
DataInputStream
FileOutputStream
Mit FileOutputStream wird eine Datei erstellt und Daten in diese geschrieben. Der Stream erstellt eine Datei, falls diese noch nicht vorhanden ist, bevor er zur Ausgabe geöffnet wird.
Hier sind zwei Konstruktoren, mit denen ein FileOutputStream-Objekt erstellt werden kann.
Der folgende Konstruktor verwendet einen Dateinamen als Zeichenfolge, um ein Eingabestreamobjekt zum Schreiben der Datei zu erstellen.
OutputStream f = new FileOutputStream("C:/java/hello")
Der folgende Konstruktor verwendet ein Dateiobjekt, um ein Ausgabestreamobjekt zum Schreiben der Datei zu erstellen. Zuerst erstellen wir ein Dateiobjekt mit der File () -Methode wie folgt:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
Sobald Sie das OutputStream- Objekt zur Hand haben, gibt es eine Liste von Hilfsmethoden , mit denen Sie in den Stream schreiben oder andere Vorgänge im Stream ausführen können.
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | public void close() throws IOException{} Diese Methode schließt den Dateiausgabestream. Gibt alle mit der Datei verknüpften Systemressourcen frei. Löst eine IOException aus. |
2 | protected void finalize()throws IOException {} Diese Methode bereinigt die Verbindung zur Datei. Stellt sicher, dass die Methode close dieses Dateiausgabestreams aufgerufen wird, wenn keine Verweise mehr auf diesen Stream vorhanden sind. Löst eine IOException aus. |
3 | public void write(int w)throws IOException{} Diese Methode schreibt das angegebene Byte in den Ausgabestream. |
4 | public void write(byte[] w) Schreibt w.length Bytes aus dem genannten Byte-Array in den OutputStream. |
Es stehen weitere wichtige Ausgabestreams zur Verfügung. Weitere Informationen finden Sie unter den folgenden Links:
ByteArrayOutputStream
DataOutputStream
Example
Das folgende Beispiel zeigt InputStream und OutputStream -
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x = 0; x < bWrite.length ; x++) {
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for(int i = 0; i < size; i++) {
System.out.print((char)is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}
Der obige Code würde die Datei test.txt erstellen und gegebene Zahlen im Binärformat schreiben. Gleiches gilt für die Ausgabe auf dem Standardbildschirm.
Dateinavigation und E / A.
Es gibt mehrere andere Klassen, die wir durchlaufen würden, um die Grundlagen der Dateinavigation und der E / A kennenzulernen.
Dateiklasse
FileReader-Klasse
FileWriter-Klasse
Verzeichnisse in Java
Ein Verzeichnis ist eine Datei, die eine Liste anderer Dateien und Verzeichnisse enthalten kann. Sie verwendenFileObjekt zum Erstellen von Verzeichnissen, zum Auflisten der in einem Verzeichnis verfügbaren Dateien. Überprüfen Sie für vollständige Details eine Liste aller Methoden, die Sie für das Dateiobjekt aufrufen können, und was sich auf Verzeichnisse bezieht.
Verzeichnisse erstellen
Es gibt zwei nützliche File Dienstprogrammmethoden, mit denen Verzeichnisse erstellt werden können -
Das mkdir( )Die Methode erstellt ein Verzeichnis und gibt bei Erfolg true und bei Fehler false zurück. Ein Fehler zeigt an, dass der im Dateiobjekt angegebene Pfad bereits vorhanden ist oder dass das Verzeichnis nicht erstellt werden kann, da der gesamte Pfad noch nicht vorhanden ist.
Das mkdirs() Methode erstellt sowohl ein Verzeichnis als auch alle übergeordneten Elemente des Verzeichnisses.
Das folgende Beispiel erstellt das Verzeichnis "/ tmp / user / java / bin" -
Example
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
Kompilieren Sie den obigen Code und führen Sie ihn aus, um "/ tmp / user / java / bin" zu erstellen.
Note- Java kümmert sich automatisch um Pfadtrennzeichen unter UNIX und Windows gemäß den Konventionen. Wenn Sie in einer Windows-Version von Java einen Schrägstrich (/) verwenden, wird der Pfad weiterhin korrekt aufgelöst.
Verzeichnisse auflisten
Sie können verwenden list( ) Methode bereitgestellt von File Objekt, um alle in einem Verzeichnis verfügbaren Dateien und Verzeichnisse wie folgt aufzulisten:
Example
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
File file = null;
String[] paths;
try {
// create new file object
file = new File("/tmp");
// array of files and directory
paths = file.list();
// for each name in the path array
for(String path:paths) {
// prints filename and directory name
System.out.println(path);
}
} catch (Exception e) {
// if any error occurs
e.printStackTrace();
}
}
}
Dies führt zu dem folgenden Ergebnis basierend auf den in Ihrem Verzeichnis verfügbaren Verzeichnissen und Dateien /tmp Verzeichnis -
Output
test1.txt
test2.txt
ReadDir.java
ReadDir.class