正在用java读取当前正在编写的日志文件

正在用java读取当前正在编写的日志文件,java,java-io,Java,Java Io,我有一个程序正在运行,它将日志写入一个文件,我想逐行读取它。我尝试使用InputStream,尤其是DataInputStream,使用它的可用方法。但是它没有readLine方法,它已被弃用,建议将其包装在BufferedReader中以使用readLine。但是当我使用BufferedReader时,它不会读取所有的行,它会以某种方式停止读取一行 public void read(DataInputStream ins) { try { while(t

我有一个程序正在运行,它将日志写入一个文件,我想逐行读取它。我尝试使用
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文档,它说使用
BufferedReade
r。但是对于
reader.readLine()
来说,它并没有像我预期的那样工作

另外,还有什么更好的java方法可以做到这一点,因为我确信这是一些标准问题。我在什么地方读到关于拖车课的消息。但无法测试这一点

来自

诀窍是使用java.io.RandomAccessFile,并定期检查文件长度是否大于当前文件位置。如果是,则读取数据。当你到达终点时,你要等待。清洗、漂洗、重复。

你需要处理互斥问题(一次只能读/写一件东西) 或者您的数据可能已损坏)

如果最终使用BufferedReader,它一次只能读取一行。如果要读取多个,可以使用如下循环:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
while ((sCurrentLine = br.readLine()) != null) 
{
    System.out.println(sCurrentLine);
}
这可能会导致IOException供参考,所以将其包装在try/catch中,或者让您的方法抛出一个IOException,然后在其他地方处理它


来源:

什么没有按预期工作?当我使用reader.readLine()时,它只读取第一行。不要使用
äavailable()
方法,它是无用的。InputStreams不会读取持续更新的文件。一旦到达流的末尾,即使基础文件更新,它们也会停止返回结果。它会继续读取第一行,或者只读取一次?如果要处理不断更新的数据,则需要使用FileChannel。这并不能解决OP的问题。标准输入流/读取器不能用于读取不断更新的文件。@jtahlborn-mmm,好的,让我看看是否能给出更好的答案。它确实解决了使用BufferedReader的文档点,所以我将离开它,我想知道如果reader当前没有任何行要读取,会发生什么,但这并不意味着文件已关闭。@jtahlborn好的,应该这样做了,所以现在您的答案只是重复其他人的答案。