我有一个固定格式的文件。
我想根据行号访问此文件中的特定行。
例如读取第100行
每行的长度为200个字节。
因此,使用RandomAccessFile将光标直接移动到第100行将是:
File f = new File(myFile);
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.skipBytes(200 * 99); // linesize * (lineNum - 1)
System.out.println(r.readLine());
但是,我得到的输出为null。
我在这里想念什么?
该问题正在继续回答我先前的问题Reaching a specific line in a file using RandomAccessFile
更新:
下面的程序完全符合我的预期:
行大小为200个字符。
File f = new File(myFile);
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.seek(201 * (lineNumber-1)); // linesize * (lineNum - 1)
System.out.println(r.readLine());
提供行号(整个文件中的任何行号)都将打印该行。
@EJP:请解释!
最佳答案
首先,如果您只是要从文件中读取而不是写入文件,那么我建议您以“ r”而不是“ rw”打开RandomAccessFile。原因是,如果打开了文件以允许写访问,则实际上可以将文件中的指针移动到大于文件长度的位置,因为您可以将文件写入所需的大小。
例如,如果您有一个100字节长的文件,则以只读模式打开它会迫使您将指针保持在这100字节的某个位置。但是,如果您以读写模式打开同一文件,则可以告诉RandomAccessFile进行seek(250),它将服从于任何问题,因为它认为您此时可能希望将数据写出到文件中。
因此,正如其他人所指出的那样,您可能已经移出了文件末尾,这在“ rw”模式下将非常有效。
其次,如果要从文件的开头进行读取,我建议您使用seek()而不是skipBytes()。通过使用seek(),可以保证您将移动到想要的确切位置,因为它始终是相对于文件开头的。但是,skipBytes()相对于文件中的当前指针位置,因此,如果您不小心将指针移到了RandomAccessFile构造函数和skipBytes()方法调用之间的代码中的某个位置,您将无法到达正确的位置。
因此,如果您要从文件的开头开始工作,seek()提供了更高的安全性级别,无论您对RandomAccessFile进行什么操作,它都将最终位于文件中的正确位置。