Достижение определенной строки в файле с помощью RandomAccessFile
Можно ли поместить курсор в начало определенной строки в файле через RandomAccessFile?
Например, я хочу изменить строку, начиная с 10 до 20 в строке 111 в файле. Файл имеет записи фиксированной длины.
Можно ли напрямую поместить курсор в начало строки 111, используя RandomAccessFile?
Обновить:
Я использовал следующий код. Тем не менее, его возвращение ноль.
Длина строки составляет 200 символов (это 200 байт, если я не ошибаюсь)
File f = new File(myFile);
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.skipBytes(200 * 99); // linesize * (lineNum - 1)
System.out.println(r.readLine());
Куда я иду не так?
4 ответа
Я не уверен, но, кажется, RandomAccessFile не поддерживает такую функциональность. Поскольку RAF работает с байтами, мы можем пропустить определенное количество байтов, и если ваш файл имеет фиксированную ширину строки, это может быть достигнуто
file.skipBytes(110 * lineSizeInBytes);
В противном случае вам нужно что-то вроде этого:
for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();
Вы не можете сделать это напрямую с RandomAccessFile
, Он предназначен для работы с бинарными файлами и помогает вам читать и записывать фрагменты таких файлов в любом произвольном месте. Вот почему класс называется RandomAccessFile
,
Но он не работает с текстами, поэтому он не может распознать конец строки и вообще не работает с точки зрения строк.
Итак, чтобы реализовать то, что вы хотите, вы должны использовать BufferedReader
Читайте построчно и, если вы хотите сохранить позицию, где начинается каждая строка, вы сможете пропустить необходимое количество байтов, чтобы перейти к началу нужной строки.
Чтобы использовать RandomAccessFile, вам нужно либо иметь записи фиксированной длины, либо иметь "допинг-вектор" смещений к началу каждой записи (или, например, каждой 10-й записи). Это может или не может соответствовать вашей проблеме.
Как утверждают некоторые другие люди, существуют другие классы, специально предназначенные для чтения строк текста, например BufferedReader. Однако, если вам необходимо использовать RandomAccessFile, вы можете читать строки текста, но вам нужно программно найти, где заканчивается 1 строка и начинается другая строка...
Простой пример может быть...
RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r");
String line = "";
while (raf.available()){
byte b = raf.read();
if (b == '\n'){
// this is the end of the current line, so prepare to read the next line
System.out.println("Read line: " + line);
line = "";
}
else {
line += (char)b;
}
}
Это дает основной строительный блок для читателя, который ищет конец каждой строки.
Если вы намереваетесь пойти по пути использования RandomAccessFile, вы можете начать с этой платформы, но вам нужно знать о некоторых недостатках и недостатках, таких как... 1. Unix и Windows используют разные линейные маркеры - вы Вам нужно будет искать '\n', '\r' и их комбинацию 2. Чтение одного байта за раз очень медленное - вы должны прочитать блок байтов в буфер массива (например, байт [2048] (массив), а затем перебрать массив, пополнив массив из RandomAccessFile, когда вы достигнете конца буферного массива. 3. Если вы имеете дело с символами Юникода, вам нужно читать и обрабатывать 2 байта за раз, а не отдельные байты.
RandomAccessFile очень мощный, но если вы можете использовать что-то вроде BufferedReader, то вам, вероятно, будет гораздо лучше использовать это вместо этого, поскольку он автоматически решает все эти проблемы.