7

是否可以通过 RandomAccessFile 将光标定位到文件中特定行的开头?

例如,我想在文件的第 111 行更改从字符 10 到 20 的字符串。该文件具有固定长度的记录。

是否可以使用 RandomAccessFile 直接将光标定位到第 111 行的开头?

更新:

我使用了以下代码。但是,它返回 null。

行长为 200 个字符(如果我没记错的话是 200 个字节)

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.skipBytes(200 * 99);   // linesize * (lineNum - 1) 
System.out.println(r.readLine());

我哪里错了?

4

4 回答 4

4

我不确定,但似乎 RandomAccessFile 不支持此类功能。由于 RAF 使用字节进行操作,我们可以跳过特定数量的字节,如果您的文件具有固定的行宽,可以通过以下方式实现

file.skipBytes(110 * lineSizeInBytes);

否则,你需要这样的东西:

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();
于 2012-03-19T12:21:48.623 回答
3

您不能直接使用RandomAccessFile. 它负责处理二进制文件,并帮助您在所需的任何随机位置读取和写入此类文件片段。这就是为什么这个类被调用RandomAccessFile

但它不适用于文本,因此它没有识别行尾的方法,并且根本不适用于行。

所以,要实现你想要的,你应该使用BufferedReader,逐行阅读,如果你想存储每行开始的位置,那么你将能够跳过所需的字节数以跳转到所需行的开头。

于 2012-03-19T12:18:41.383 回答
1

要使用 RandomAccessFile,您要么需要有固定长度的记录,要么需要在每条记录的开头(或者,例如,每 10 条记录)有一个偏移量的“涂料向量”。这些可能适合也可能不适合您的问题。

于 2012-03-19T12:23:10.653 回答
1

正如其他人所说,还有其他专门设计用于读取文本行的类,例如 BufferedReader。但是,如果您需要使用 RandomAccessFile,您可以读取文本行,但您需要以编程方式查找 1 行结束和另一行开始的位置...

一个简单的例子可能是...

RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r");
String line = "";
while (raf.available()){
  byte b = raf.read();
  if (b == '\n'){
    // this is the end of the current line, so prepare to read the next line
    System.out.println("Read line: " + line);
    line = "";
    }
  else {
    line += (char)b;
    }
  }

这为查找每行末尾的阅读器提供了基本构建块。

如果您打算走上使用 RandomAccessFile 的道路,您可以从这个框架开始,但您需要了解一些缺点和问题,例如... 1. Unix 和 Windows 使用不同的行标记 - 您'将需要查找'\n'、'\r' 以及这两者的组合 2. 一次读取一个字节非常慢 - 您应该将一个字节块读入数组缓冲区(例如一个字节[2048] 数组),然后遍历数组,当到达缓冲区数组的末尾时,从 RandomAccessFile 重新填充数组。3. 如果是处理 Unicode 字符,则需要一次读取和处理 2 个字节,而不是单个字节。

RandomAccessFile 非常强大,但是如果您可以使用 BufferedReader 之类的东西,那么使用它可能会更好,因为它会自动处理所有这些问题。

于 2012-03-19T12:56:56.150 回答