如何使用java从最后一行读取文件到第一行

时间:2013-01-28 10:20:35

标签: java

    FileInputStream fstream = new FileInputStream("\\file path");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
     while (br.ready()) {

                                line = br.readLine();
    }

如果行号不固定且随时间变化,请告诉我如何从最后一行读取文件到第一行?我知道以上内容对于从第一行读取它很有用...

7 个答案:

答案 0 :(得分:0)

将文件读入列表,然后向后处理该列表...... 文件和流通常设计为向前发展;所以直接用流做这个可能会变得很尴尬。只有当文件非常庞大时才建议...

答案 1 :(得分:0)

您无法向后读取缓冲区,但您可以按照以下链接中的说明计算缓冲区的行数

http://www.java2s.com/Code/Java/File-Input-Output/Countthenumberoflinesinthebuffer.htm

然后使用以下代码选择您的行:

FileInputStream fs= new FileInputStream("someFile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < 30; ++i)
  br.readLine();
String lineIWant = br.readLine();

正如你所看到的那样,在你到达你想要的那条线之前,你会迭代,读取每一行(并且什么都不做)(这里我们通过31行,#32是一行读取)。如果您的文件很大,这将花费很多时间。

其他方法是在List中输入所有内容,然后使用sizeof()和for(),您可以选择所需的一切。

答案 2 :(得分:0)

如果您知道每条线的长度,那么您可以通过查看文件的大小并除以每条线的长度来计算出有多少条线。 (这当然忽略了文件中任何可能的元数据)

然后,您可以使用一些数学来获取最后一行的起始字节。完成后,您可以在文件上打开RandomAccessFile,然后使用seek转到该点。然后使用readline,然后read最后一行

虽然这些线的长度都相同但确实如此。

答案 3 :(得分:0)

您可以使用FileUtils

并使用此方法

static List<String> readLines(File file) 
          Reads the contents of a file line by line to a 
          List of Strings using the default encoding for the VM.

这将返回一个List,然后使用Collections.reverse()

然后简单地迭代它以相反的顺序获取文件行

答案 4 :(得分:0)

这可能对您有帮助[1]:http://mattfleming.com/node/11

答案 5 :(得分:0)

只是向后保存信息,这就是我所做的一切。只是阅读Pryor保存并使用\ n

答案 6 :(得分:-1)

你可以将这些行保存在一个列表中(在我的代码中是一个arraylist)并从arraylist中“向后读”这些行:

try
    {

        FileInputStream fstream = new FileInputStream("\\file path");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = "";
        ArrayList<String> lines = new ArrayList<String>();

        //Read lines and save in ArrayList 
        while (br.ready())
        {
            lines.add(br.readLine());
        }

        //Go backwards through the ArrayList
        for (int i = lines.size(); i >= 0; i--)
        {
            line = lines.get(i);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }