【问题标题】:Reading a log file in java which in currently being written [duplicate]在java中读取当前正在写入的日志文件[重复]
【发布时间】:2013-06-20 15:56:43
【问题描述】:

我正在运行一个将日志写入文件的程序,我想逐行读取它。我尝试使用InputStream,尤其是DataInputStream,使用其可用的方法。但是它没有readLine 方法,它已被弃用,建议将其包装在BufferedReader 中以使用readLine。但是当我使用BufferedReader 时,它不会读取所有行,它会以某种方式停止读取一行。

public void read(DataInputStream ins) {
        try {
            while(true) {
                if(ins.available() > 0) {
                    //BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
                    //System.out.println(reader.readLine());
                    System.out.println(ins.readLine());
                }
                else {
                    Thread.sleep(200);
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
}

因此,该代码适用于 ins.readLine(),但它已被弃用,根据 java 文档,它使用 BufferedReader 说。但是reader.readLine() 并没有像我预期的那样工作。

另外,还有什么其他更好的 java 方法可以做到这一点,因为我确信这是一些标准问题。我在某处读到了预告片类。但无法测试。

【问题讨论】:

  • 什么没有按预期工作?
  • 当我使用 reader.readLine() 时,它只读取第一行
  • 不要使用ävailable()方法,没用。 InputStreams 不会读取持续更新的文件。一旦到达流的末尾,即使底层文件更新,它们也将停止返回结果。
  • 一直读第一行,还是只读一次?
  • 如果要处理不断更新的数据,则需要使用 FileChannel。

标签: java java-io


【解决方案1】:

来自How do you continuously read a file in Java?

The trick is to use a java.io.RandomAccessFile, and periodically check if the file length is greater that your current file position. If it is, then you read the data. When you hit the length, you wait. wash, rinse, repeat.

不过,您需要处理互斥问题(一次只能读/写一件事 否则您的数据可能已损坏)

如果您最终使用 BufferedReader,它会一次读取一行。如果你想读多个,你可以使用这样的循环:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
while ((sCurrentLine = br.readLine()) != null) 
{
    System.out.println(sCurrentLine);
}

这可能会导致 IOException fyi,因此请将其包装在 try/catch 中,或者让您的方法抛出一个并在其他地方处理它。

来源:http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/

【讨论】:

  • 这不能解决 OP 的问题。标准 InputStreams/Readers 不能用于读取持续更新的文件。
  • @jtahlborn mmm,好吧,让我看看我能否给出更好的答案。它确实解决了使用 BufferedReader 的文档要点,所以我将保留它
  • 我想知道如果阅读器当前没有任何要读取的行会发生什么,但这并不意味着文件已关闭。
  • @jtahlborn 好的,应该这样做
  • k,所以现在你的答案只是别人的重复。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 2012-05-27
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多