Können Sie springen einen scanner an einen Speicherort in einer Datei oder rückwärts?
Ich habe eine sehr große text-Datei, und ich brauche, um Daten zu sammeln, die irgendwo in der Nähe des Ende. Vielleicht Scanner ist nicht der beste Weg, dies zu tun, aber es wäre sehr verschwenderisch, beginnen an der Spitze und greifen 6000 Zeilen, bevor man sich auf den Teil der Datei, die ich mich interessiere. Gibt es eine Möglichkeit, entweder zu sagen-Scanner, um zu springen, um zu sagen 7/8ths unten das Dokument oder starten Sie von unten und Scannen Sie nach oben greifen Zeile für Zeile?
Dank
- 6000 Zeilen hört sich nicht viel an. Haben Sie es ausprobiert? Tut dies Häufig genug ausgeführt, um es Wert zu erschweren alles?
- 6000 ist nur meine verwässert text-Datei. Ich bin besorgt über die viel viel größere Dateien in das Feld. Ich bin auch dabei einen großen Schwerpunkt auf die Programme, die Reaktionsfähigkeit und ich will nicht zu halten, bis das system mit einer Verarbeitung, die es nicht wirklich brauchen, zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den zugrunde liegenden input-Quelle für eine
java.util.Scanner
ist einjava.lang.Lesbar
. Über dieScanner(File)
Konstruktor, eineScanner
weder weiß, noch kümmert er sich um die Tatsache, dass es das Scannen einer Datei.Auch, da es regex basiert auf
java.util.regex.*
gibt es keine Möglichkeit, es kann rückwärts.Zu erreichen, was Sie tun möchten, ist es am besten, es zu tun, am Eingang Quelle Ebene, z.B. durch die Verwendung von
InputStream.überspringen
der Quelle vor der übergabe an den Konstruktor vonScanner
.Auf
Scanner.skip
Scanner
selbst hat eineskip
, und ein Muster wie"(?s).{10}"
würde überspringen 10 Zeichen (in(?s)
single-line/- Muster.DOTALL
- Modus), aber das ist vielleicht eher Kreisverkehr Weg, es zu tun.Hier ist ein Beispiel für die Verwendung
skip
zu überspringen, die eine bestimmte Anzahl von Zeilen.Abzüge (wie gesehen auf ideone.com):
InputStream
Ebene. Wenn Sie nicht, z.B., die Sie überspringen möchten die eine Anzahl von Linien, und der Eingang ist dynamisch genug, dass man nicht Vorverarbeiten erstellen Sie einen index aus, dann nurScanner.skip
. Unnötig zu sagen, diese Methode überspringt die mit passendem den Eingang, so dass es tatsächlich schon eine Menge Arbeit.skip
Teil gibt mirjava.lang.StackOverflowError
wenn ich versuche ein argument statt der4
in einer statischen MethodeScanner
umschließt eineInputStream
verwenden, können Sie den streamskip(long)
Methode überspringen die Zeilen, die Sie nicht wollen, und dann starten Sie das scanning.Lesen Sie mehr in der
InputStream
javadocskip
nicht überspringen Zeilen überspringt bytes, und es gibt keine Möglichkeit zu sagen, wie viele bytes in jeder Zeile, ohne Sie zu Lesen. Aber es ist ein guter Weg, um zu überspringen einige Daten.Sollten Sie wahrscheinlich verwenden RandomAccessFile statt.