Java 跳到一行并阅读它
我必须处理大文件(很多GB),需要快速查找以根据请求检索特定行 其想法是维护映射:Java 跳到一行并阅读它,java,file,io,Java,File,Io,我必须处理大文件(很多GB),需要快速查找以根据请求检索特定行 其想法是维护映射: some_key -> byte_location 其中字节位置表示行在文件中的起始位置 编辑:问题有点变了: 首先,我使用: FileInputStream stream = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); FileChannel c
some_key -> byte_location
其中字节位置表示行在文件中的起始位置
编辑:问题有点变了:
首先,我使用:
FileInputStream stream = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
FileChannel channel = stream.getChannel();
我注意到FileChannel.position()
不会返回读卡器当前读取的确切位置,因为它是一个“缓冲”读卡器。它读取给定大小的块(这里是16k),因此我从FileChannel得到的是16k的倍数,而不是阅读器实际读取的确切位置
PS:文件在UTF-8中任何不创建
文件InputStream
的原因,请调用流。跳过(pos)
,然后在其周围创建一个InputStreamReader
,并在InputStreamReader
周围创建一个缓冲区Reader
?我会尝试这样的方法:
RandomAccessFile raf = new RandomAccessFile(file);
...
raf.seek(position);
raf.readLine();
...
问题是将每个字节转换成一个字符,其前8位为零。如果您的文件是ASCII或Latin-1,这很好,但对于UTF-8来说有问题
但是,如果您准备使用RandomAccessFile来写入文件,则可以使用and来读写编码为修改的UTF-8字符串的“行”
跟进
该死的…utf-8字符被拧紧了 是的。。。见上文 使用
RandomAccessFile
处理UTF-8的另一个想法:
readFully(byte[])
方法将一组字节读入byte[]
pos
==缓冲区中行尾的位置新字符串(字节、0、pos、UTF-8)
转换为Java字符串这比使用
readLine()
更麻烦,但在以随机顺序从文件中读取多行时,它应该比使用FileInputStream
和skip()
更快。文件的编码是什么?问题是什么?如何跳转到输入流中的给定位置<代码>输入跳过(pos)代码>。或者如何找到所需的位置以跳转阅读整行内容,而不是部分内容?我正在寻找的InputStreamReader
是我丢失的链接。谢谢。@arnaud:如果你真的不知道你想在哪里读书,很难想象你怎么才能摆脱它。。。在不读取所有数据的情况下读取特定行基本上是困难的。你的文件会被固定很长时间吗?如果是这样的话,你可以努力准确地读取整个数据,只需记住准确的偏移量。计划是首先扫描所有数据,逐行读取并存储一些“检查点”:重要的线及其位置。一旦这个索引在内存中并且有请求出现,目标就是跳转到最近的检查点并进行快速查找…啊…我想唯一的方法就是扩展类并自己存储位置。该死的…utf-8字符被拧紧了