Ich habe ein Writer-Programm, das eine Textzeile in eine Datei schreibt und dann wartet, bis der Benutzer zurückkehrt, bevor er eine andere Zeile schreibt und dann beendet wird. Erst danach wird die Datei geschlossen. Der Code:Warum wird der FileInputStream read() nicht blockiert?
public class Writer {
Writer() {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.FileOutputStream pw =
new java.io.FileOutputStream("myfile.txt");
for(String s : strings) {
pw.write(s.getBytes());
System.in.read();
}
pw.close();
}
}
beginnen zuerst mit:
java Writer
Dann habe ich auch ein Leseprogramm haben, das sollte (auch ich erwartet hatte) blockieren, solange das Schreiben der Datei ist noch nicht fertig (dh p.close() wurde noch nicht aufgerufen). Der Code:
public class ReaderFIS extends Object {
ReaderFIS() {
}
public static void main(String[] args) throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");
int ch = -1;
while((ch = in.read()) >= 0) {
System.out.println("ch = " + ch);
}
System.out.println("Last ch = " + ch);
System.out.println("exiting");
}
}
beginnen mit:
java ReaderFIS
Jetzt habe ich die Lese erwartet() zu blockieren, nachdem die erste "Hallo Welt" Text zu lesen, auf dieser Basis in die Javadoc-Dokumentation:
Liest ein Datenbyte aus diesem Eingabestream. Diese Methode blockiert, wenn noch keine Eingabe verfügbar ist. Via: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
Aber die ReaderFIS werden sofort nach der Lektüre „Hallo Welt“ gemacht und sieht offenbar einen EOF! So ist es nicht Block! Es gibt die Zeichenwerte aus, dann eine -1 und dann "Beenden".
Output: ch = 72 ch = 101 ch = 108 ch = 108 ch = 111 ch = 32 ch = 87 ch = 111 ch = 114 ch = 108 ch = 100 Last ch = -1
Andere Variationen Verlassen habe ich versucht wurden: über eine getChannel Lesung(), über getChannel Überprüfung(), wenn es Sperre sein kann() ed, mit den verfügbaren() lesen Der Versuch() mit einem Puffer, versucht readLine(), kontinuierlich ein Zeichen zu schreiben Geben Sie in der Datei eine Pause von 500 ms zwischen den einzelnen Schreibvorgängen ein, und schreiben Sie nichts, sondern halten Sie die Datei im Writer offen.
Keine dieser Variationen bewirkt, dass das ReaderFIS-Programm blockiert, es wird immer beendet.
Warum blockiert das Leseprogramm nicht? Habe ich etwas so offensichtlich übersehen? Es scheint, dass das ReaderFIS-Programm einen EOF (-1) findet, aber warum? Die Datei wurde vom Writer-Programm noch nicht geschlossen.
"Lustige" Nebenbemerkung: Die System.in.read() blockiert! (und darauf warten, dass der Benutzer Enter drückt).
PS: versuchte dies unter Windows XP und Suse Linux. Unter Windows kann ich die Datei nicht löschen, während der Schreiber läuft (was ich erwartet habe).
Grüße, Marco
Wenn Sie auf Festplatte schreiben, erzwingen Sie einen EOF, nein? Der EOF wird nur verschoben, wenn Sie neue Informationen anhängen. Aber der Block auf der Platte muss einen EOF haben ... – jcolebrand
Sie sagen also, der EOF wird * immer * geschrieben, weil eine Datei immer einen braucht. Aber ich dachte, ein EOF wird nur am Ende geschrieben, nachdem die Datei gespült und geschlossen wurde. Aber das bedeutet, dass mein read() niemals beim Lesen einer Datei blockiert, weil es * immer * ein EOF gibt und immer ein -1 zurückgibt, selbst wenn die Datei leer ist. Also ist das JavaDoc inkorrekt? – QQQuestions