0

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

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

例如读取第 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());

但是,我得到的输出为空。

我在这里想念什么?

该问题继续回答我之前的问题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

4 回答 4

1

RandomAccessFile.readLine()在文件末尾返回 null。正如它在 Javadoc 中所说的那样。

所以你在文件的末尾。

所以你的计算是不正确的。

于 2012-03-20T09:49:42.813 回答
1

首先,如果您只是从文件中读取,而不是写入文件,那么我建议您将 RandomAccessFile 打开为“r”而不是“rw”。原因是,如果打开文件以允许写入访问,您实际上可以将文件中的指针移动到大于文件长度的位置,因为您可以将文件写入您想要的任意大小。

例如,如果您有一个长度为 100 字节的文件,以只读模式打开它会强制您将指针保留在这 100 字节中的某个位置。然而,如果你以读写模式打开同一个文件,你可以告诉 RandomAccessFile 去 seek(250) 并且它会毫无问题地服从,因为它认为你可能想在文件的这个位置写出数据。

因此,正如其他一些人所说,您可能已经超出了文件的末尾,这在“rw”模式下非常有效。

其次,如果您要从文件的开头读取,我建议您使用 seek() 而不是 skipBytes()。通过使用 seek(),您可以保证您正在移动到您想要的确切位置,因为它始终相对于文件的开头。但是,skipBytes() 是相对于文件中的当前指针位置的,因此如果您不小心将指针移动到代码中 RandomAccessFile 构造函数和 skipBytes() 方法调用之间的某个位置,您将不会到达正确的位置.

因此,如果您要从文件的开头开始工作,seek() 提供了更高级别的安全性,无论您对 RandomAccessFile 执行什么其他操作,您都将在文件中的正确位置结束。

于 2012-03-20T12:31:14.023 回答
0

EJP 说的是正确的:http ://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html

  • 确认您必须更正文件。使用不存在的文件创建 RandomAccessFile 将引发异常。由于您没有例外,因此您已经使用 A 文件创建了 RandomAccessFile。确保它是正确的。
  • RandomAccessFile 使用内部文件位置指针。如果您已经在文件末尾,并再次跳过一些字节,它将解释您提到的行为。请确保您在文件中的正确位置。
于 2012-03-20T10:43:42.313 回答
-1
byte[] line = new byte[200];
r.seek(200 * 99);
r.read(line);
String s = new String(line, "UTF-8"); // Or probably "Cp1252"
于 2012-03-20T09:13:17.633 回答