RandomAccessFile - 返回空字符串

时间:2012-03-20 09:04:02

标签: java file io random-access

我有一个固定格式的文件。

我想根据行号访问此文件中的特定行。

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:请解释一下!

4 个答案:

答案 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

  • 确认您必须更正文件。使用不存在的文件创建RandomAccessFile将引发异常。由于您没有异常,因此您已使用A文件创建了RandomAccessFile。确保它是正确的。
  • RandomAccessFile使用内部文件位置指针。如果您已经在文件的末尾,并再次跳过一些字节,它将解释您提到的行为。请确保您在文件中的正确位置。

答案 3 :(得分:-1)

byte[] line = new byte[200];
r.seek(200 * 99);
r.read(line);
String s = new String(line, "UTF-8"); // Or probably "Cp1252"