Достижение определенной строки в файле с помощью RandomAccessFile

можно ли поместить курсор в начало определенной строки в файле через RandomAccessFile?

например, я хочу изменить строку, начиная с char 10 до 20 в строке 111 в файле. Файл фиксированная длина записи.

можно ли напрямую поместить курсор в начало строки 111 с помощью RandomAccessFile ?

обновление:

я использовал следующий код. Однако его возвращение null.

линия длина 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, вы можете начать с этой структуры, но вам нужно знать о ряде недостатков и got-ya, таких как... 1. Unix и Windows используют разные маркеры линий - вам нужно будет искать "\n", "\r " и комбинацию обоих из них 2. Чтение одного байта за раз очень медленно - вы должны прочитать блок байтов в буфер массива (например, массив byte[2048]), а затем перебирать массив, пополняя массив из RandomAccessFile, когда вы достигните конца буферного массива. 3. Если вы имеете дело с символами Юникода, нужно читать и обрабатывать 2 байта за раз, а не один байт.

RandomAccessFile очень мощный, но если вы можете использовать что-то вроде BufferedReader, вам, вероятно, будет намного лучше использовать это вместо этого, поскольку он автоматически решает все эти проблемы.