Folgendes Beispiel liest einen Text von der Standardeingabe ein und
speichert ihn in einer Datei, bis ein x eingegeben wird.
Anschließend wird diese Datei ausgelesen und
ihr Inhalt auf der Standardausgabe ausgegeben:
import java.io.*;
public class FileDemo {
final static String name = "FileDemo.dat";
public static void main(String args[]) {
File textFile; // Textdatei
FileReader in; // Dateieingabe-Stream
FileWriter out; // Dateiausgabe-Stream
// Standardeingabe in Reader umwandeln
BufferedReader stdin;
stdin = new BufferedReader(
new InputStreamReader(System.in));
PrintWriter stdout=new PrintWriter(System.out,true);
// Erzeugen eines Ausgabe-Streams, der mit der Datei
// 'FileDemo.dat' verknüpft ist
try {
out = new FileWriter(name);
int key = 0;
// Einlesen von Text von der Standardeingabe
// bis zur Eingabe eines x und
// gleichzeitiges Abspeichern des Textes
do {
try {
key = stdin.read();
out.write(key);
}
catch(IOException e) {
e.printStackTrace();
}
}
while((char)key != 'x');
out.close(); // Schließen der Datei
// Erzeugen eines Eingabe-Streams, der mit
// der Datei verknüpft ist
textFile = new File(name);
in = new FileReader(textFile);
int size = (int)textFile.length(); // Dateilänge
int read = 0; // Anzahl der gelesenen Zeichen
char data[] = new char[size]; // Lesepuffer
// Auslesen der Datei
while (read < size)
read =+ (byte)in.read(data, read, size-read);
in.close();
// Ausgabe des Lesepuffers
stdout.println(new String(data));
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
Um in eine
bestimmte Datei schreiben zu können, muss zuerst
eine Verknüpfung zwischen der Datei und ihrem Namen hergestellt werden. Hierzu
existieren zwei Möglichkeiten:
Obiges Beispiel verwendet beide Varianten.
Bei der Dateiausgabe wird der Dateiname direkt über FileWriter mit der
Datei verknüpft:
out = new FileWriter(name);
Das Anlegen eines Streams zum Lesen einer Datei erfolgt entsprechend durch Erzeugen eines
Exemplars von FileReader.
Der Zugriff auf die Datei erfolgt analog zum Schreiben bzw. Lesen in andere Streams.
Die
Größe der Datei kann anschließend mit der Methode
length() der Klasse File ermittelt werden:
int size = (int)textFile.length(); // Dateilänge
Dadurch, dass man die Größe einer Datei kennt,
kann man genau so viele Zeichen lesen,
wie sich tatsächlich in der Datei befinden. Man muss also nicht abfragen, ob man
sich am Dateieinde befindet:
while (read < size)
read =+ (byte)in.read(data, read, size-read);
Würde man nicht die Dateigröße abfragen, müsste man so lange lesen, bis das Ende der
Datei erreicht wird. Kann kein Zeichen mehr gelesen werden,
liefert read(char[], int, int)
das Ergebnis -1.
Die Einlesesequenz hätte dann folgende Gestalt:
int z;
while((z = in.read()) != -1 )
stdout.print((char)z);
Die Datei wird zeichenweise ausgelesen, bis man sich am Dateiende befindet. In diesem
Fall liefert read() -1 als Ergebnis. Dieses Prinzip wurde auch
schon beim Auslesen des SequenceInputStreams angewendet.