Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
So wie ich das verstanden habe, puffert der BufferedReader/Writer Dateizugriffe, um die Geschwindigkeit zu erhöhen.
Allerdings hat doch jedes Betriebssystem einen Lese- und Schreibcache für Festplatten, bringt es da wirklich noch etwas, den BufferedReader/-Writer zu benutzen? Ist das nur dafür da, wenn man über ein Netzwerk oder eine Flashkarte oder irgendsoetwas liest oder schreibt?
Probiers doch einfach aus: Kopiere eine größere Datei und nimm mit System.currentTimeMillis die Zeit.
BufferedReader und -Writer sind vor allem auch bequemer: Ich weiß ja nicht, wie du das hältst, aber ich schlage mich eher ungern mit einzelnen chars herum...
@Landei: Naja, unbequemer finde ich z.B. den Scanner oder den PrintWriter nicht unbedingt. Aber ich habe es mal getestet. Ergebnis: Das schreiben ist gleichschnell aber der Lesevorgang ist ungepuffert viel langsamer.
Aber meine eigentliche Frage bleibt ja unbeantwortet:
Warum hilft der Lesecache da nicht?
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException
{
// Write
long start;
long end;
long elapsedTime;
PrintWriter[] out =
{
new PrintWriter("test.txt"),
new PrintWriter(new BufferedWriter(new FileWriter("test.txt")))
};
for(int writerNr=0;writerNr<out.length;writerNr++)
{
start = System.currentTimeMillis();
for(int i=0;i<1000*1000;i++) out[writerNr].println("test"+i);
end = System.currentTimeMillis();
elapsedTime = end-start;
System.out.println((writerNr==0?"un":"")+"buffered write time in milliseconds: "+elapsedTime);
}
// Read scanner
Scanner scanner = new Scanner(new File("test.txt"));
start = System.currentTimeMillis();
while(scanner.hasNextLine()) scanner.nextLine();
end = System.currentTimeMillis();
elapsedTime = end-start;
System.out.println("unbuffered scanner read time in milliseconds: "+elapsedTime);
// Read BufferedReader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
start = System.currentTimeMillis();
while(bufferedReader.readLine()!=null);
end = System.currentTimeMillis();
elapsedTime = end-start;
System.out.println("BufferedReader read time in milliseconds: "+elapsedTime);
}
}
Ausgabe
---------
unbuffered write time in milliseconds: 703
buffered write time in milliseconds: 641
unbuffered scanner read time in milliseconds: 2437
BufferedReader read time in milliseconds: 220
P.S.: Ich habe auch folgendes probiert, mit ähnlichen Resultaten:
Java:
Writer[] out =
{
new PrintWriter("test.txt"),
new BufferedWriter(new FileWriter("test.txt"))
};
[...]
for(int i=0;i<1000*1000;i++) out[writerNr].write("test"+i+"\n");
Ausgabe
---------
unbuffered write time in milliseconds: 594
buffered write time in milliseconds: 422
unbuffered scanner read time in milliseconds: 2531
BufferedReader read time in milliseconds: 251
wer weiß, ohne Lesecache wäre es vielleicht 10 Sek statt 2.5,
ohne Testmöglichkeit kann man ja kaum entscheiden, ob er hilft oder nicht,
vielleicht hilft er auch besonders beim gleichzeitigen Lesen mehrere Dateien oder oder oder
ein Scanner hat übrigens auch einen internen Buffer von 1024, der sollte eigentlich nicht langsam sein
edit auch mit makis Hinweis:
vielleicht hilft hier gerade der Cache, dass der zweite Lesevorgang schneller ist,
tausche die doch mal um, dann ist vielleicht der Scanner scheinbar schneller
Sieh dir mal die Definition von beidem an, dir sollte etwas auffallen
Abgesehen davon sind Dateien traditionell sog. "Blockorientierte" Geräte, man kann nicht nur ein einzelnes Byte auf eine Festplatte schreiben, sondern immer nur einen ganzen Sektor, beim lesen genauso.
Bildschirm und Tastatur sind dagegen Zeichenorientierte Geräte, zumindest klassisch gesehen.
Vor allen Dingen existiert der IO-Cache nur innerhalb des BS. Sogar in BS nahen Sprachen wo man direkten Zugriff auf den Cache haben könnte, wird dringend empfohlen, seine Daten nicht direkt aus diesem zu lesen, sondern eben selbst zu Puffern. Die JVM verwendet deswegen mit absoluter Sicherheit auch die Schreib- / Leseroutinen des jeweiligen BS. BufferedStream bzw. -Reader machen deswegen Sinn, um bereits in die JVM geladene Daten eben dort zu erhalten und nicht erneut vom BS anfordern zu müssen.