Java Random - mit unterschiedlichen Newline Arten zu tun?
-
22-09-2019 - |
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?
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.