Чтение / запись файлов построчно отчетной позиции

1

Я хочу читать и писать файлы по очереди.

Мои первые мысли состояли в том, чтобы использовать BufferedReader и BufferedWriter но мой вопрос заключается в том, что мне нужно знать, насколько далеко я просматриваю файлы.

Когда я читаю, мне хотелось бы, насколько я могу обработать файл, и я бы хотел, чтобы он был точным, поэтому после каждого readLine() я ожидаю, что позиция будет обновлена, это осложняется тем фактом, что есть буфер,

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

Прежде чем изобретать колесо здесь или использовать какое-то изворотливое отражение, есть ли что-нибудь в JDK, которое может помочь мне здесь?

EDIT: Просто, чтобы очистить вещи, я ищу байт позиции.

Теги:
io

2 ответа

0

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

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Timer;
import java.util.TimerTask;


public class ConsoleReader {

   /**
    * @param args
    */
    public static void main(String[] args) {
    File file = new File("fileName");
       try {
           RandomAccessFile r = new RandomAccessFile(file, "r");
           //First time read
           String str = null;
           while((str = r.readLine()) != null) {
            System.out.println(str);
           }
           r.seek(r.getFilePointer());
           startTimer(r);
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } 
    }

    private static void startTimer(final RandomAccessFile r) {
     Timer timer = new Timer();
     timer.scheduleAtFixedRate(new TimerTask() {
     @Override
     public void run() {
     String str = null;
     try {
          while((str = r.readLine()) != null) {
           System.out.println(str);
          } 
          r.seek(r.getFilePointer()); 
     } catch (IOException e) { 
         e.printStackTrace();
     }
      }
 }, 0, 1000);
    }
}
0

Не совсем понятно, исходя из вашего вопроса, что вы подразумеваете под "как далеко через обработку файла я". Означает ли это номер строки или байтов?

Если это означает номер строки, существуют два варианта:

A) Следите за номерами строк вручную. Не должно быть так сложно. Просто увеличивайте счетчик для каждой строки.

B) Используйте java.io.LineNumberReader, как было предложено @Jesper

Если это означает положение байта, увеличьте счетчик позиции байта на каждую длину строки и не забудьте также включить символы новой строки в положение байта.

При записи нет LineNumberWriter, поэтому вам нужно следить за счетчиками вручную. Не должно быть трудно.

  • 0
    Извините, просто для ясности, я ищу байтовые позиции.
  • 0
    Ну, тогда LineNumberReader не помогает. Я рекомендую сохранять счетчик байтов и увеличивать его на длину строки (включая символ новой строки!), Когда вы читаете строки, и делайте то же самое для записи. Да, это требует некоторого ручного кодирования, но не должно быть таким сложным.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню