我在磁盘上有一个大文本文件(csv),我正在拆分成行。像这样:
BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader .readLine()) != null) {
...
}
我想要做的是计算每1000行的文件起始偏移量,所以如果将来我想读取第10,001行,我可以直接跳到偏移X,然后开始迭代。
文件可以以任何方式编码,因此字节和字符之间没有很强的关系。
有没有人知道任何“计算读者”或其他方法?我很高兴自己实现一个阅读器,但如果我能避免它,就不想写一个非常复杂的类。
答案 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想要读取的位置(以字节为单位)。