Frage

Ich versuche, durch eine Random und als Teil eines Algorithmus zu suchen, ich habe eine Linie zu lesen, und dann versuchen, rückwärts vom Ende der Zeile

Z. B

String line = raf.readLine();
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length());

//m is a Matcher for regular expressions

Ich habe immer eine Menge Off-by-one Fehler und konnte nicht herausfinden, warum. Ich habe gerade entdeckt, es ist, weil einige Dateien, die ich aus haben UNIX-Zeilenumbrüche Lesen bin, \ r \ n, und einige haben nur Windows-Stil. \ N

Gibt es eine einfache den Random haben behandeln alle Zeilenvorschübe als Fenster-Stil Zeilenumbrüche?

War es hilfreich?

Lösung

Sie konnte immer wieder der Strom bis zwei Bytes und wieder lesen, sie zu sehen, ob es \ r \ n oder (\ r!) \ N:

String line = raf.readLine();
raf.seek(raf.getFilePointer()-2);
int offset = raf.read() == '\r' ? 2 : 1;
raf.read(); //discard the second character since you know it is either \n or EOF by definition of readLine
raf.seek (raf.getFilePointer() - (line.length()+offset) + m.start() + m.group().length());

Ich bin mir nicht sicher, wo genau Sie versuchen, den Dateizeiger zu platzieren, stellt so die 2/1 Konstanten entsprechend. Sie können auch eine zusätzliche Überprüfung für leere Zeilen hinzufügen müssen (\ n \ n), wenn sie in der Datei auftreten, als ob es zeigt sich Ihnen in einer Endlosschleife hängen bleiben könnte, ohne Code zu Schritt vorbei.

Andere Tipps

Nein. Random und verwandte Abstraktionen (einschließlich der zugrunde liegenden Dateisysteme) Modelldateien als Wende Bytefolge. Sie wissen nicht, oder kümmern sich um Leitungen oder Leitungsabschlüsse.

Was Sie tun müssen, ist es, die aktuellen Positionen der Zeile beginnt aufzuzeichnen, anstatt zu versuchen, um herauszufinden, wo sie auf Annahmen über basieren, was die Leitungsabschlusssequenz ist. Alternativ dazu verwenden, um eine Zeilenlesegerät, das erfasst die Leitungsabschlusssequenz für jede Zeile, die sie liest, entweder als Teil der Leitung oder in ein Attribut, das nach dem Lesen jeder Eingangsleitung zugegriffen werden kann.

Alternativ konvertieren alle Dateien DOS Leitungsabschlusssequenzen zu verwenden, bevor Sie sie für den Direktzugriff öffnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top