Java RandomAccessFile - работа с различными стилями новой строки? - PullRequest
0 голосов
/ 24 марта 2010

Я пытаюсь выполнить поиск в RandomAccessFile, и в рамках алгоритма мне нужно прочитать строку, а затем выполнить поиск в обратном направлении от конца строки

* 1003 например *

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

//m is a Matcher for regular expressions

Я получаю множество отдельных ошибок и не могу понять, почему. Я обнаружил, что это потому, что некоторые файлы, из которых я читаю, имеют перевод строки в стиле UNIX, \ r \ n, а некоторые имеют стиль \ n.

Легко ли, чтобы RandomAccessFile рассматривал все переводы строки как перевод строки в стиле Windows?

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Вы всегда можете создать резервную копию потока вверх на два байта и перечитать их, чтобы увидеть, является ли он \ r \ n или (! \ 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());

Я не уверен, где именно вы пытаетесь разместить указатель файла, поэтому настройте константы 2/1 соответствующим образом. Вам также может понадобиться добавить дополнительную проверку пустых строк (\ n \ n), если они встречаются в вашем файле, как если бы он обнаружил, что вы можете застрять в бесконечном цикле без кода, чтобы пройти мимо него.

1 голос
/ 24 марта 2010

Нет. RandomAccessFile и связанные абстракции (включая базовые файловые системы) моделируют файлы в виде индексируемой последовательности байтов. Они не знают и не заботятся о строках или окончаниях строк.

Что вам нужно сделать, это записать фактические позиции начала строки, а не пытаться выяснить, где они основаны на предположениях о том, какова последовательность завершения строки. В качестве альтернативы используйте средство чтения строки, которое захватывает последовательность завершения строки для каждой строки, которую она читает, либо как часть строки, либо как атрибут, к которому можно получить доступ после чтения каждой строки ввода.

Либо преобразуйте все файлы в последовательности завершения строки DOS, прежде чем открывать их для произвольного доступа.

...