2016-10-26 3 views
1

Ich habe einen Doppelpunkt über Klasse BufferedReader. Das ist mein Test. Ich erstelle die einfache txt-Datei: "test.txt" mit 1024 Zeilen. Jede Zeile enthält die Zeilennummer und den Dateinamen (Beispiel: "1 - test.txt"):Java-Klasse BufferedReader Größe

Test-Dateierstellung:

$ for i in {0..1023}; do echo "$i - test.txt" >> test.txt; done 
$ ls -la test.txt 
-rw-r--r-- 1 osb  osb   12288 Oct 26 12:01 test.txt 

Die Java-Klasse für meinen Test (f eine Variable Datei ist Klasse):

... 
while (f.exists()) 
    { 
     BufferedReader br = null; 

     try 
     { 

      br = new BufferedReader(new FileReader(f), 10); 

      while ((line = br.readLine())!=null) 
      { 
       System.out.println (line); 
       Thread.sleep(1000); 
      } 

     } 

     ... 
     catch excepion 
     ... 

     finally 
     { 
      try 
      { 
       br.close(); 
      } 
      catch (IOException e) 
      { 
       System.out.println ("\nError closing Buffer reader!"); 
       e.printStackTrace(); 
      } 
      br = null; 
      line = null; 
     } 

    } 
... 

Wenn die Anwendung die Zeilen ich diesen Unix-Befehl ausführen zu schreiben beginnt:

gzip test.txt 

Ich erwarte eine Ausnahme, weil die Puffergröße sehr klein ist (10 Byte) weniger als un Zeilengröße, aber die Anwendung liest alle 1024 Zeilen und nur wenn sie das Ende der Datei erreicht, löst sie die Ausnahme aus (Datei existiert nicht!). Hat der BufferedReader eine Puffergröße von mehr als 10? Gibt es eine minimale Puffergröße?

Dank

Antwort

1

Ihr Problem ist im Grunde, dass Ihre Annahmen alle Realität up nicht entsprechen.

Sie denken, dass Ihr Java-Code direkt "mit dieser Datei" irgendwo auf einem Laufwerk interagiert.

Aber in Wirklichkeit haben Sie mehrere Schichten zwischen "Ihrem Java-Code" und dem "Ding" da draußen. In erster Linie: der Linux-Kernel. Selbst wenn Sie einen BufferedReader verwenden, ist es sehr wahrscheinlich, dass der Linux-Kernel den Inhalt Ihrer kleinen Textdatei vollständig gelesen hat, sobald Ihr Programm gestartet wird. So bemerkt Ihr "Lese" -Code gar nicht, dass die zugrundeliegende Datei in der Zwischenzeit umbenannt wurde!

Nur am Ende, wenn Sie den Puffer schließen, bemerkt die JVM, dass die Dinge schief sind.

+0

Danke GhostCat für Ihre schnelle Antwort, ich verstehe das Szenario –