0

我在磁盘上有一个大文本文件 (csv),我将其分成几行。像这样的东西:

BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader .readLine()) != null) { 
   ...
}

我想要做的是计算每 1,000 行从文件开头的偏移量,所以如果将来我想读取第 10,001 行,我可以直接跳转到偏移量 X,然后开始迭代。

该文件可以以任何方式编码,因此字节和字符之间没有强关系。

有谁知道任何“计数读者”或替代方法?我很高兴自己实现了一个 Reader,但如果可以避免的话,我不想写一个非常复杂的类。

4

1 回答 1

1

当你需要随机访问时,BufferedReader是不适合的。相反,您需要查看Channel它的子类FileChannel等等。

使用通道读取的简单示例:

    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
    FileChannel inChannel = aFile.getChannel();

    ByteBuffer buf = ByteBuffer.allocate(48);

    int bytesRead = inChannel.read(buf);
    while (bytesRead != -1) {

      System.out.println("Read " + bytesRead);
      buf.flip();

      while(buf.hasRemaining()){
          System.out.print((char) buf.get());
      }

      buf.clear();
      bytesRead = inChannel.read(buf);
    }
    aFile.close();  

来源:http ://tutorials.jenkov.com/java-nio/channels.html

至于您从上次中断的位置读取的问题,FileChannel定义了一种方法read(ByteBuffer buf,int position),其中位置是您想要读取的字节位置。

于 2013-10-17T20:15:11.050 回答