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

                                line = br.readLine();
    }

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

4

7 回答 7

0

将文件读入列表,并向后处理该列表......文件和流通常设计为向前工作;所以直接用流做这个可能会有点尴尬。仅在文件非常大时才建议...

于 2013-01-28T10:26:51.307 回答
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() 您可以选择所需的所有内容。

于 2013-01-28T10:33:20.843 回答
0

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

然后,您可以使用一些数学来获取最后一行的起始字节。一旦你有了,你就可以在文件上打开一个 RandomAccessFile,然后使用seek去那个点。然后使用 readline 你可以读取最后一行

这确实假设这些线都是相同的长度。

于 2013-01-28T10:43:34.200 回答
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()

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

于 2013-01-28T10:50:35.577 回答
0

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

于 2013-01-28T12:56:01.927 回答
0

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

于 2017-02-04T23:41:53.853 回答
-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();
    }
于 2013-01-28T10:39:45.693 回答