In jeder Java-Implementierung, die ich vom Lesen einer Datei sehe, sehe ich fast immer einen Dateileser, der Zeile für Zeile gelesen wird. Mein Gedanke wäre, dass dies furchtbar ineffizient wäre, weil es einen Systemaufruf pro Leitung erfordert.Java - Lesen von einer Datei. Eingabestream vs. Reader
Was ich stattdessen getan habe, ist einen Eingabestream zu verwenden und die Bytes direkt zu greifen. In meinen Experimenten ist dies deutlich schneller. Mein Test war eine 1 MB-Datei.
//Stream method
try {
Long startTime = new Date().getTime();
InputStream is = new FileInputStream("test");
byte[] b = new byte[is.available()];
is.read(b);
String text = new String(b);
//System.out.println(text);
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
//Reader method
try {
Long startTime = new Date().getTime();
BufferedReader br = new BufferedReader(new FileReader("test"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
String text = sb.toString();
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
Daraus ergibt sich ein Ergebnis von:
Text length: 1054631, Total time: 9
Text length: 1034099, Total time: 22
Also, warum Menschen nutzen Leser statt Streams?
Wenn ich eine Methode habe, die eine Textdatei nimmt und einen String zurückgibt, der den gesamten Text enthält, ist es dann unbedingt besser, einen Stream zu verwenden?
Ihr Code ist nicht korrekt. Es ist nicht garantiert, dass es die gesamte Datei lesen wird, siehe die Dokumentation der gelesenen und verfügbaren Methoden. – Milo
Hatten Sie versucht, [Files.readAllLines ([java.nio.File] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html)) Paket (.. .) Methode. –
+1 für etwas Neues gelernt – panny