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

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

例如,我想在文件中第111行的char 10到20之间更改String。 该文件具有固定长度的记录。

是否可以使用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()); 

我哪里错了?

我不确定但似乎RandomAccessFile不支持这样的function。 由于RAF以字节操作,我们可以跳过特定的字节数,如果你的文件有固定的行宽,这可以通过

 file.skipBytes(110 * lineSizeInBytes); 

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

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

您无法使用RandomAccessFile直接执行此操作。 它可以处理二进制文件,并帮助您在任何随机位置读取和写入此类文件片段。 这就是该类被称为RandomAccessFile

但它不适用于文本,所以它没有办法识别行尾,根本不能用行。

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

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

正如其他人所说,还有其他专门用于读取文本行的类,例如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这样的东西,那么你可能会更好地使用它,因为它会自动处理所有这些问题。