Es gibt viele Möglichkeiten, Java-Dateien zu lesen, aber ich habe gemessen, welche die schnellste war. Dieses Mal habe ich gemessen, indem ich alle Zeilen gelesen habe.
1.Files.readAllLines Lesen Sie alle Zeilen einer Datei mit readAllLines von java.nio.file.Files, die aus Java7 eingeführt wurden. Intern wird nur ein BufferedReader erstellt, zeilenweise gelesen, in eine Liste aufgenommen und zurückgegeben.
try {
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedReader reader = new BufferedReader(new FileReader(file));){
String str;
List<String> lines = new ArrayList<>();
while ((str = reader.readLine()) != null) {
lines.add(str);
}
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));){
String str;
List<String> lines = new ArrayList<>();
while ((str = reader.readLine()) != null) {
lines.add(str);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
List<String> lines = Files.lines(path, StandardCharsets.UTF_8).collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
Ich habe versucht, es mit der folgenden Quelle auszuführen TestFile ist eine Textdatei mit 200.000 Zeilen.
private static final String PATH = "src/test/java/com/test/common/TestFile";
public static void main(String[] args) {
Path path = Paths.get(PATH);
File file = path.toFile();
// Files.ReadAllLines-Messung
Runnable test1 = () -> {
try {
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
};
//BufferedReader Messung von FileReader
Runnable test2 = () -> {
try (BufferedReader reader = new BufferedReader(new FileReader(file));){
String str;
List<String> lines = new ArrayList<>();
while ((str = reader.readLine()) != null) {
lines.add(str);
}
} catch (IOException e) {
e.printStackTrace();
}
};
//BufferedReader InputStreamReader FileInputStream-Messung
Runnable test3 = () -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));){
String str;
List<String> lines = new ArrayList<>();
while ((str = reader.readLine()) != null) {
lines.add(str);
}
} catch (IOException e) {
e.printStackTrace();
}
};
// Files.ReadAllLines-Messung
Runnable test4 = () -> {
try {
List<String> lines = Files.lines(path, StandardCharsets.UTF_8).collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
};
calcFuncTime(test1);
calcFuncTime(test2);
calcFuncTime(test3);
calcFuncTime(test4);
}
/**
*Messzeit
* @param runnable
*/
private static void calcFuncTime(Runnable runnable) {
long start = System.nanoTime();
runnable.run();
long end = System.nanoTime();
System.out.println(end - start);
}
Ausführungsergebnis
101206619
178792154
53933069
102386121
Bei der Überprüfung der Ausführungsergebnisse war der langsamste Fall der zweite und der früheste der dritte Fall. Der Unterschied beträgt jedoch ungefähr 0,1 Sekunden. Wenn es also einen Unterschied von ungefähr 200.000 Zeilen gibt, müssen Sie sich meiner Meinung nach keine Sorgen machen. Persönlich empfehle ich die Verwendung von FileReader nicht, da Sie keine Zeichencodes verwenden können und langsam sind. Die Methode mit FileInputStream ist die schnellste, aber da die Beschreibung groß ist, ist die Methode mit Files wahrscheinlich die beste. Bitte entschuldige mich.
Recommended Posts