2013-06-20 56 views
3

我有一个程序正在运行,它将日志写入文件,我想逐行读取它。我尝试使用InputStream,特别是DataInputStream,使用其可用的方法。但它没有readLine方法,它已被弃用,并建议将其包装在BufferedReader中以使用readLine。但是,当我使用BufferedReader它不读取所有行,它通过读取一行停下来。在java中读取当前正在写入的日志文件

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文档使用它BufferedReade r表示。但与reader.readLine()它不工作,因为我期望。

另外,有什么其他更好的java方式来做到这一点,因为我相信这是一些标准问题。我读了关于拖车类的地方。但无法测试。

+0

什么不按预期工作? – NINCOMPOOP

+0

当我使用reader.readLine()时,它只读取第一行 – r0b0

+0

不使用'ävailable()'方法,这是没用的。 InputStreams不会读取持续更新的文件。一旦他们到达流结束,他们将停止返回结果,即使底层文件更新。 – jtahlborn

回答

0

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所以包装在一个try/catch或有你的方法抛出一个和处理它在其他哪里。

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

+0

这不是goint解决OP的问题。标准InputStreams/Readers不能用于读取持续更新的文件。 – jtahlborn

+0

@jtahlborn嗯,好吧,看看我能否给出更好的答案。它确实解决了使用BufferedReader的文档点,但是我会离开它 – Daniel

+0

我想知道如果读者目前没有任何行可以读取,会发生什么情况,但这并不意味着文件已关闭。 – r0b0