Java 跳到一行并阅读它

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

我必须处理大文件(很多GB),需要快速查找以根据请求检索特定行

其想法是维护映射:

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
    ==缓冲区中行尾的位置
  • 如果未找到,请读取更多字节,连接并转至步骤2
  • 如果找到,请使用
    新字符串(字节、0、pos、UTF-8)
    转换为Java字符串

  • 这比使用
    readLine()
    更麻烦,但在以随机顺序从文件中读取多行时,它应该比使用
    FileInputStream
    skip()
    更快。

    文件的编码是什么?问题是什么?如何跳转到输入流中的给定位置<代码>输入跳过(pos)。或者如何找到所需的位置以跳转阅读整行内容,而不是部分内容?我正在寻找的
    InputStreamReader
    是我丢失的链接。谢谢。@arnaud:如果你真的不知道你想在哪里读书,很难想象你怎么才能摆脱它。。。在不读取所有数据的情况下读取特定行基本上是困难的。你的文件会被固定很长时间吗?如果是这样的话,你可以努力准确地读取整个数据,只需记住准确的偏移量。计划是首先扫描所有数据,逐行读取并存储一些“检查点”:重要的线及其位置。一旦这个索引在内存中并且有请求出现,目标就是跳转到最近的检查点并进行快速查找…啊…我想唯一的方法就是扩展类并自己存储位置。该死的…utf-8字符被拧紧了