读/写文件逐行报告位置

时间:2015-03-24 08:20:49

标签: java io

我希望逐行阅读和写一些文件。

我的第一个想法是使用BufferedReaderBufferedWriter但我的问题是我需要知道我的文件有多远。

在阅读时,我想知道我在多大程度上处理文件并且我希望它是准确的,所以在每个readLine()之后我都希望更新这个位置,这是因为有一个缓冲区。

同样适用于写作,我需要在写一行之前和之后准确地获得位置。我猜这并不困难,因为我的理解是BufferedWriter无论如何都要在每个换行符后刷新,所以考虑到我正在写行,我可以直接写入通道。

在我重新发明轮子之前,或者使用一些狡猾的反射之前,JDK中有什么可以帮我解决这个问题吗?

编辑:为了清理,我正在寻找字节位置。

2 个答案:

答案 0 :(得分:0)

根据您的问题,“我处理文件的距离”是什么意思并不完全清楚。这是指行号还是字节位置?

如果这意味着行号,则实际上有两个选项:

A)手动跟踪行号。不应该那么难。只需为每一行增加一个计数器。

B)按照@Jesper

的建议使用java.io.LineNumberReader

如果它表示字节位置,则按字符串长度递增字节位置计数器,并且不要忘记在字节位置包含换行符。

写入时,没有LineNumberWriter,因此您需要手动跟踪计数器。不应该很难。

答案 1 :(得分: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);
    }
}