计算char流消耗的字节数

时间:2013-10-17 20:09:10

标签: java io nio

我在磁盘上有一个大文本文件(csv),我正在拆分成行。像这样:

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

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

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

有没有人知道任何“计算读者”或其他方法?我很高兴自己实现一个阅读器,但如果我能避免它,就不想写一个非常复杂的类。

1 个答案:

答案 0 :(得分: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),其中position是yu想要读取的位置(以字节为单位)。