如何在 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 的随机访问文件中返回一行的位置?的主要内容,如果未能解决你的问题,请参考以下文章

jAVA如何使一个数组里面的元素随机交换位置

RandomAccessFile类

文件和随机访问文件有啥区别?

hadoop学习记录HDFS java api

Java核心类库-IO-随机访问文件(RandomAccessFile)

JAVA如何随机读取记事本中的某一行