Question

Je suis en train de chercher à travers un RandomAccessFile, et dans le cadre d'un algorithme je dois lire une ligne, puis recherche vers l'arrière à partir de la fin de la ligne

par exemple

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

//m is a Matcher for regular expressions

je reçois des tas de hors-une par des erreurs et ne pouvait pas comprendre pourquoi. Je viens de découvrir c'est parce que certains fichiers que je lis d'avoir linefeeds style UNIX, \ r \ n, et certains ont juste fenêtres de style \ n.

est-il facile d'avoir le RandomAccessFile traiter tous les linefeeds comme linefeeds fenêtres de style?

Était-ce utile?

La solution

vous pouvez toujours revenir sur le flux deux octets et les relire pour voir si elle est \ r \ n ou (! \ 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());

Je ne sais pas exactement où vous essayez de placer le pointeur de fichier, afin d'ajuster les constantes de façon appropriée 2/1. Vous devrez peut-être ajouter un contrôle supplémentaire pour les lignes vides (\ n \ n) si elles se produisent dans votre fichier, comme il apparaît, vous risquez d'être coincé dans une boucle infinie sans le code à l'étape dépasser.

Autres conseils

Non. RandomAccessFile et abstractions connexes (y compris les systèmes de fichiers sous-jacents) les fichiers de modèle comme une séquence d'octets indexables. Ils ne savent ou se soucient de lignes ou terminaisons de ligne.

Ce que vous devez faire est d'enregistrer les positions réelles de la ligne commence plutôt que d'essayer de comprendre où ils sont basés sur des hypothèses sur ce que la séquence de terminaison de ligne est. En variante, utiliser un lecteur de ligne qui capture la séquence de terminaison de ligne pour chaque ligne qu'il lit, soit en tant que partie de la ligne ou dans un attribut qui peut être accessible après lecture de chaque ligne d'entrée.

Vous pouvez également convertir tous les fichiers à utiliser des séquences de terminaison de ligne DOS avant de les ouvrir pour un accès aléatoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top