使用 RandomAccessFile 到达文件中的特定行

Posted

技术标签:

【中文标题】使用 RandomAccessFile 到达文件中的特定行【英文标题】:Reaching a specific line in a file using RandomAccessFile 【发布时间】:2012-03-19 12:07:41 【问题描述】:

是否可以通过 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());

我哪里错了?

【问题讨论】:

【参考方案1】:

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

file.skipBytes(110 * lineSizeInBytes);

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

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();

【讨论】:

每一行包含 \n 字符。所以,实际上你应该跳过 lineCount * (lineSize + 1)。【参考方案2】:

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

但是它对文本不起作用,所以它没有办法识别行尾,而且根本就行不工作。

所以,要实现你想要的,你应该使用BufferedReader,逐行读取,如果你想存储每行开始的位置,这样你就可以跳过所需的字节数来跳转到所需行的开头。

【讨论】:

+1,但 OP 迟来评论说该文件有固定长度的记录。 @Andrew Thompson,你是对的。我没有注意这个细节。 不,它只是在您的答案发布后 被提及。我将其编辑到问题中,以避免进一步混淆。【参考方案3】:

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

【讨论】:

【参考方案4】:

正如其他人所说,还有其他专门设计用于读取文本行的类,例如 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. 一次读取一个字节非常慢 - 您应该将一个字节块读入数组缓冲区(例如 byte[2048] 数组),然后遍历数组,当您到达时从 RandomAccessFile 重新填充数组缓冲区数组的末尾。 3.如果是处理Unicode字符,需要一次读取和处理2个字节,而不是单个字节。

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

【讨论】:

以上是关于使用 RandomAccessFile 到达文件中的特定行的主要内容,如果未能解决你的问题,请参考以下文章

java IO流 RandomAccessFile的使用

RandomAccessFile 文件读写中文乱码解决方案!

Java IO流RandomAccessFile类的使用

RandomAccessFile类

Java IO2:RandomAccessFile

文件处理RandomAccessFile