我有一个固定格式的文件。
我想根据行号访问此文件中的特定行。
e.g。阅读第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:请解释一下!
答案 0 :(得分:1)
RandomAccessFile.readLine()
在文件末尾返回null。正如它在Javadoc中所说的那样。
所以你在文件的末尾。
所以你的计算结果不正确。
答案 1 :(得分:1)
首先,如果您只是要从文件中读取而不是写入文件,那么我建议您将RandomAccessFile打开为“r”而不是“rw”。原因是,如果文件打开以允许写访问,您实际上可以将文件中的指针移动到大于文件长度的位置,因为您可以根据需要将文件写入尽可能大的位置。
例如,如果您的文件长度为100个字节,则以只读模式打开它将强制您将指针保留在这100个字节的某个位置。但是,如果您以读写模式打开同一个文件,您可以告诉RandomAccessFile寻找(250)并且它会毫无问题地服从,因为它认为您可能希望在文件中此处写入数据。 / p>
所以,正如其他一些人所说,你可能已经超过了文件的末尾,这在“rw”模式下非常有效。
其次,如果您要从文件的开头读取,我建议您使用seek()而不是skipBytes()。通过使用seek(),您可以保证移动到您想要的确切位置,因为它始终相对于文件的开头。但是,skipBytes()是相对于文件中的当前指针位置,所以如果你不小心碰巧在RandomAccessFile构造函数和skipBytes()方法调用之间的代码中移动指针,你就不会到达正确的位置
所以,如果你打算从文件的开头开始工作,那么seek()提供了更高级别的安全性,你将最终放在文件中的正确位置,无论你做什么, RandomAccessFile。
答案 2 :(得分:0)
EJP所说的是正确的:http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html
答案 3 :(得分:-1)
byte[] line = new byte[200];
r.seek(200 * 99);
r.read(line);
String s = new String(line, "UTF-8"); // Or probably "Cp1252"