Wie können Sie mit Hilfe von Java-Scanner sehr große Dateien lesen?
-
19-09-2019 - |
Frage
Ich verwende die folgende Grundfunktion, die ich aus dem Netz kopiert, um eine Textdatei zu lesen
public void read ()
{
File file = new File("/Users/MAK/Desktop/data.txt");
System.out.println("Start");
try
{
//
// Create a new Scanner object which will read the data from the
// file passed in. To check if there are more line to read from it
// we check by calling the scanner.hasNextLine() method. We then
// read line one by one till all line is read.
//
Scanner scanner = new Scanner(file);
int lineCount = 0;
if (scanner == null)
{
System.out.println("Null File");
}
else
{
System.out.println(scanner.toString());
}
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
System.out.println("Line " + lineCount +" contain : " + line);
lineCount++;
}
System.out.println("End of Try Bluck");
}
catch (FileNotFoundException e)
{
e.printStackTrace();
System.out.println("Exception Bluck");
}
System.out.println("End");
}
}
Es funktioniert gut mit mittlerer und kleiner Datei (die 10-20.000 Datenzeile enthält) Allerdings scheiterte er mit einer Datei arbeiten, die 500 Tausend Zeilen enthalten. Ich bin nicht erhalte eine Fehlermeldung (zumindest nicht zu sehen, jemand). Also, was ist los? Was soll ich hier tun, um bereit, eine so große Dateien zu können?
Hinweis: Ich stieg bereits den Heap für 2 GB auf der Testmaschine, die Windows Server 2008 mit 4 GB RAM. aber so viel nicht helfen!
Bitte kann mir jemand sagen, was ich soll hier tun?
Update 01
Im Folgenden ist der Ausgang
Start
java.util.Scanner [Begrenzungszeichen = \ p {javaWhitespace} +] [position = 0] [übereinstimmen gültig = false] [Notwendigkeit input = false] [Quelle geschlossen = false] [übersprungenen = false] [group separator = \] [Dezimalzeichen =.] [positive prefix =] [negative prefix = \ Q- \ E] [positive suffix =] [negative suffix =] [NaN string = \ Q \ E] [infinity string = \ Q ∞ \ E]
Ende der Try Bluck
Ende
Lösung
Besser geht für BufferedReader mit einem Filereader
Andere Tipps
Wenn Sie einen Fehler nicht bekommen, könnte es auch nur eine lange Zeit sein. Ist die Platte immer noch aktiv? Was machst du mit der Konsolenausgabe - hat es aufgehört? Sie sagen, dass es „zur Arbeit nicht bestanden“, aber Sie haben nicht gesagt, wie es verhält sich eigentlich. Was sehen Sie?
Speicher sollten kein Problem sein, da du nicht wirklich mit den Linien etwas zu tun -. Sie nur zählen und sie an die Konsole zu schreiben
Ein Problem in Ihrem Code - Sie überprüfen, ob scanner
null ist, aber es kann nicht möglicherweise , weil Sie die Referenz von einem Konstruktor-Aufruf zurückgegeben verwenden. Welche Situation waren Sie versuchen, mit fertig zu werden?