2010-03-24 19 views
0

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 ligneJava RandomAccessFile - traitant de différents styles de nouvelle 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 

J'ai eu des tas d'erreurs au hasard et ne pouvait pas comprendre pourquoi. Je viens de découvrir que c'est parce que certains fichiers que je lis ont des sauts de ligne de type UNIX, \ r \ n, et certains ont juste un style Windows \ n.

Est-ce qu'il est facile de faire en sorte que le RandomAccessFile traite tous les retours à la ligne comme des sauts de ligne de type Windows?

Répondre

1

Vous pouvez toujours sauvegarder 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, donc ajustez les constantes 2/1 de manière appropriée. Vous pouvez également avoir besoin d'ajouter une vérification supplémentaire pour les lignes vides (\ n \ n) si elles apparaissent dans votre fichier, comme si elles apparaissaient, vous pourriez être coincé dans une boucle infinie sans code pour passer devant lui.

+0

Merci, c'est ce que j'ai dû faire à la fin. J'ai demandé parce que j'avais beaucoup de ces lectures dans le code. Au début du code j'ai vérifié un '\ r' à la fin de la ligne. Si cela correspond, je définirais une variable à 1, elseide à 0. Ensuite, juste ajouté cette variable sur raf.seek (...). Merci pour l'aide – bcoughlan

1

N ° RandomAccessFile et les abstractions connexes (y compris les systèmes de fichiers sous-jacents) modélisent les fichiers sous la forme d'une séquence indexable d'octets. Ils ne connaissent ni ne se soucient des lignes ou des terminaisons de ligne. Ce que vous devez faire est d'enregistrer les positions réelles des départs de ligne 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. Vous pouvez également utiliser un lecteur de ligne qui capture la séquence de terminaison de ligne pour chaque ligne lue, soit dans le cadre de la ligne, soit dans un attribut accessible après avoir lu chaque ligne d'entrée.

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

+0

Ce n'était pas une option car je devais d'abord lire la ligne pour décider si je pouvais revenir en arrière dessus. Merci pour la contribution. – bcoughlan