Достижение определенной строки в файле с помощью RandomAccessFile - PullRequest
7 голосов
/ 19 марта 2012

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

Например, Я хочу изменить строку, начиная с 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 ]

4 голосов
/ 19 марта 2012

Я не уверен, но, кажется, RandomAccessFile не поддерживает такую ​​функциональность. Поскольку RAF работает с байтами, мы можем пропустить определенное количество байтов, и если ваш файл имеет фиксированную ширину строки, это может быть достигнуто с помощью

file.skipBytes(110 * lineSizeInBytes);

В противном случае вам нужно что-то вроде этого:

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();
2 голосов
/ 19 марта 2012

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

Но он не работает с текстами, поэтому у него нет способа распознавать конец строки и вообще не работает в терминах строк.

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

1 голос
/ 19 марта 2012

Как утверждают некоторые другие люди, существуют другие классы, специально предназначенные для чтения строк текста, например 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. Чтение одного байта за один раз очень медленное - вы должны прочитать блок байтов в буфер массива (например, массив byte [2048]), а затем выполнить итерацию по массиву, пополняя массив из RandomAccessFile, когдаВы достигаете конца буферного массива.3. Если вы имеете дело с символами Юникода, вам нужно читать и обрабатывать 2 байта за раз, а не отдельные байты.

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

1 голос
/ 19 марта 2012

Чтобы использовать RandomAccessFile, вы должны либо иметь записи фиксированной длины, либо иметь «допинг-вектор» смещений к началу каждой записи (или, например, каждой 10-й записи).Это может или не может соответствовать вашей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...