使用RandomAccessFile java读取文件中的特定索引

使用RandomAccessFile java读取文件中的特定索引,java,randomaccessfile,Java,Randomaccessfile,我试图使用RandomAccessFile从两个特定索引之间的文件读取数据 我知道我可以使用seek()函数跳转到一个索引,但是在找到一个特定的索引之前,我找不到如何从文件中读取文本的答案 例如,我有一个巨大的文件,我想从索引100到索引500读取文本,我会这样开始: public String get_text(){ raf.seek(100) //raf= my RandomAccessFile String txt=raf.read(500) //read until inde

我试图使用RandomAccessFile从两个特定索引之间的文件读取数据

我知道我可以使用
seek()
函数跳转到一个索引,但是在找到一个特定的索引之前,我找不到如何从文件中读取文本的答案

例如,我有一个巨大的文件,我想从索引100到索引500读取文本,我会这样开始:

public String get_text(){
   raf.seek(100) //raf= my RandomAccessFile
   String txt=raf.read(500) //read until index 500 which i don't know how to do
   return txt;
}

请帮助我:)

这就是我解决问题的方法:

try {
    int index = 100;
    raf.seek(index); //index = 100
    int counter = 0;
    int length = 400;
    while (counter < length) { //want to read the characters 400 times
       char c = (char) raf.read();
       if (!(c == '\n')) {   //don't append the newline character to my result
           sb.append(c);    //sb is a StringBuilder
           counter++;
       }
    }
} catch (IOException e) {
    e.printStackTrace();
}
在这个解决方案中,字节数组的长度必须在换行符中考虑,因此您必须考虑行长度来计算字节数组的长度。
->在文件中以换行符开始,在文件中以换行符结束索引。长度=endinfle startInFile+1

这就是我解决问题的方法:

try {
    int index = 100;
    raf.seek(index); //index = 100
    int counter = 0;
    int length = 400;
    while (counter < length) { //want to read the characters 400 times
       char c = (char) raf.read();
       if (!(c == '\n')) {   //don't append the newline character to my result
           sb.append(c);    //sb is a StringBuilder
           counter++;
       }
    }
} catch (IOException e) {
    e.printStackTrace();
}
在这个解决方案中,字节数组的长度必须在换行符中考虑,因此您必须考虑行长度来计算字节数组的长度。
->在文件中以换行符开始,在文件中以换行符结束索引。长度=endinfle startInFile+1

第二种解决方案应使用
readFully()
。否则就不能保证缓冲区被填满了。嗯,我看不出如果我看JavaDocs read()会有更多的异常捕获。。。你能解释一下为什么缓冲区不能被填满吗?因为在
read()
的合同中没有说明缓冲区会被填满。这就是它返回计数的原因<另一方面,code>readFully()保证填充缓冲区或抛出
EOFEException
或另一个
IOException
,或阻塞,直到其中一个事件发生。您的答案中的
read()
方法既不是这两种方法,也没有提供,这使得您的答案充其量也不完整。@user207421现在我明白了,谢谢,我会更正它。read()不会抛出EOFEException,但会抛出IOException:IOException-如果第一个字节由于文件结尾以外的任何原因无法读取,或者如果随机访问文件已关闭,或者如果发生其他I/O错误,我不知道你为什么要告诉我这些。我知道这一点。这就是我要告诉你的。它返回一个计数,而不是抛出
EOFEException
。这就是重点。特别是当您忽略计数时。第二种解决方案应使用
readFully()
。否则就不能保证缓冲区被填满了。嗯,我看不出如果我看JavaDocs read()会有更多的异常捕获。。。你能解释一下为什么缓冲区不能被填满吗?因为在
read()
的合同中没有说明缓冲区会被填满。这就是它返回计数的原因<另一方面,code>readFully()保证填充缓冲区或抛出
EOFEException
或另一个
IOException
,或阻塞,直到其中一个事件发生。您的答案中的
read()
方法既不是这两种方法,也没有提供,这使得您的答案充其量也不完整。@user207421现在我明白了,谢谢,我会更正它。read()不会抛出EOFEException,但会抛出IOException:IOException-如果第一个字节由于文件结尾以外的任何原因无法读取,或者如果随机访问文件已关闭,或者如果发生其他I/O错误,我不知道你为什么要告诉我这些。我知道这一点。这就是我要告诉你的。它返回一个计数,而不是抛出
EOFEException
。这就是重点。尤其是当你忽略计数的时候。