Zählen von Zeilen in großen Datendateien in Java
Das Zählen der Anzahl von Zeilen in riesigen Datendateien kann eine entmutigende Aufgabe sein. Das zeilenweise Durchlaufen der Datei ist zwar ein gängiger Ansatz, aber zeitaufwändig und ineffizient.
Eine effizientere Alternative ist die Verwendung der folgenden optimierten Methode:
public static int countLines(String filename) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(filename)); try { byte[] c = new byte[1024]; int count = 0; int readChars = 0; boolean empty = true; while ((readChars = is.read(c)) != -1) { empty = false; for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') { ++count; } } } return (count == 0 && !empty) ? 1 : count; } finally { is.close(); } } public static int countLinesNew(String filename) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(filename)); try { byte[] c = new byte[1024]; int readChars = is.read(c); if (readChars == -1) { // bail out if nothing to read return 0; } // make it easy for the optimizer to tune this loop int count = 0; while (readChars == 1024) { for (int i = 0; i < 1024;) { if (c[i++] == '\n') { ++count; } } readChars = is.read(c); } // count remaining characters while (readChars != -1) { for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') { ++count; } } readChars = is.read(c); } return count == 0 ? 1 : count; } finally { is.close(); } }
Diese Methode liest die Datei in Blöcken von 1024 Bytes, wodurch die Anzahl der Dateisystemzugriffe im Vergleich zum zeilenweisen Lesen erheblich reduziert wird. Es verwaltet die Anzahl der in jedem Block gefundenen Zeilen und akkumuliert die Gesamtzahl.
Benchmarks haben gezeigt, dass diese Methode deutlich schneller ist als die Verwendung von LineNumberReader. Bei einer 1,3-GB-Textdatei benötigt die optimierte Methode etwa 0,35 Sekunden zum Zählen der Zeilen, während LineNumberReader etwa 2,40 Sekunden benötigt.
Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen in großen Java-Datendateien effizient zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!