如何在 Java 的随机访问文件中返回一行的位置?
Posted
技术标签:
【中文标题】如何在 Java 的随机访问文件中返回一行的位置?【英文标题】:How can i return the position of a line in a Random Access file in Java? 【发布时间】:2011-12-23 22:00:13 【问题描述】:我创建了一个随机访问文件,并在其中写入了一些信息。 我想将随机访问文件中每一行的位置存储在一个数组中。 我将有一个指向随机访问文件每一行的索引。 所以我需要在我的索引中存储随机访问文件的行的位置。
我的程序如下
package randomaccessfile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class raf
public static void main(String[] args) throws FileNotFoundException, IOException
File file = new File("DocumentsFile.txt");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
for (int i = 0; i <= 10 ; i++)
String sentence = "1 Info Name Surname"; //i create sentences in the random access file
raf.seek(file.length());
raf.writeBytes(sentence);
raf.writeBytes("\r\n");
raf.close();
对于在随机访问文件中创建的每一行, 我想将他们的位置存储在一个数组中。
然后位置将存储在索引中。
有什么方法可以用来返回一行的位置 在随机访问文件中?
【问题讨论】:
【参考方案1】:RandomAccessFile
已经提供了你想要的一切。
首先,这里不需要seek()
:文件指针前进超过每次写入操作写入文件的字节。
这意味着,在您写入行n
之后,无论n
的值如何,从RandomAccessFile
对象中获取.getFilePointer()
的结果将为您提供行n+1
的起始偏移量。第 1 行从偏移量 0 开始,这几乎是您在这里真正需要考虑的唯一事情。
【讨论】:
【参考方案2】:另一方面,如果您真正关心的是行号,则可以使用 LineNumberReader 将写入文件中的每一行映射到给定的行号。
File file = new File("jedi.txt");
try(LineNumberReader lnr = new LineNumberReader(new FileReader(file)))
String line = null;
while ( (line = lnr.readLine()) != null)
System.out.println(lnr.getLineNumber() + " " + line );
catch(IOException e)
e.printStackTrace();
当然,这与 RandomAccessFiles 无关,但根据您的操作,它可能是另一种选择。
【讨论】:
嗯,您可以使用 LineNumberReader 初始化数组,然后使用 RandomAccessFile 将新行写入文件,当您这样做时,您可以简单地更新相应的数组。所以,我们可以只使用 LineNumberReader 作为数组初始化机制。 不过,我不明白你想如何实现这一目标?【参考方案3】:您可以使用临时变量来存储最后一个 FilePointer。如果 readline 必须反转,可以使用这个变量来设置 reader 指针。
RandomAccessFile myReader = new RandomAccessFile(fileObject, "r");
long current_postion = myReader.getFilePointer();
myReader.readLine();
if (line should be reversed)
myReader.seek(current_postion); //Point to the previous line
【讨论】:
以上是关于如何在 Java 的随机访问文件中返回一行的位置?的主要内容,如果未能解决你的问题,请参考以下文章