如何使用Java ON LINUX实时读取文本文件?

时间:2015-08-17 18:02:14

标签: java linux stream real-time compatibility

我把' ON LINUX'在大写不要惹恼你,但因为我已经能够在Windows上使用3个不同的文件阅读类来做到这一点。 FileIntputStream 的BufferedReader RandomAccessFile的 (最后两个我肯定,但第一个可能是错的 - 我的记忆是baaad。)所有这些都在我的窗户上工作得很好。 我对这些读者的预期用途是逐行读取文本文件,这意味着,当保存此文件的新版本并附加新行时,java程序将读取此行,对其执行某些操作并执行此操作。然后继续检查另一条新线。

我尝试使用Java 7 openJDK,Java 7 Oracle和Java 8 Oracle环境进行编译,所有生成的.jars在Windows上运行良好,而且由于Java是跨平台的,我认为它们也适用于Linux(对吗?)但是我编译的每个版本在linux上测试时都失败了。 这是由一个运行Linux Red Hat的社区论坛成员引起我的注意,没有错误/异常,看起来它正在运行但是没有工作。我今天安装了Ubuntu并为自己试了一下:读者会很好地阅读原始文件,但不要" stream"该文件是实时的。对文件的更改不会引起注意。 我很困惑这是怎么可能的,说实话,我很惊讶它没有在任何地方长大(据我所知,大声笑)。希望这意味着我在确保某人可能追踪的Linux兼容性方面犯了一个愚蠢的错误。 任何和所有帮助/答案/解决方法表示赞赏!

以下是我尝试在我的程序中实现的代码示例:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Driver {

    public static void main(String[] args) {
        RandomAccessFile reader = null;
        try {
            reader = new RandomAccessFile(new File("/home/citats/csgo/console.log"), "r");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String currLine;
        Boolean done = false;
        while (!done) {
            try {
                if ((currLine = reader.readLine()) != null)
                {
                    System.out.println(currLine);
                    if (currLine.equals("done"))
                        done = true;
                } else
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        reader.close();
    }
}

1 个答案:

答案 0 :(得分:0)

拖尾文件

要获得tail -f等解决方案正在关注新文件更新的功能,然后对其进行操作,请参阅以下答案:How can I follow a file like "Tail -f" does in Java without holding the file open (Prevent rename/delete)。这个来源可以提供您正在尝试的信息。我怀疑一些寻求解决你所看到的问题。 Tailer Source

实现类似结果但功能更强大的另一种非常有趣的方法是使用JavaRX文件,您可以使用Java NIO以更加异步的方式安排新的更改。主页上有一个示例:RxJava file github page

import com.github.davidmoten.rx.FileObservable;
import rx.Observable;
import java.io.File; 

Observable<String> items = 
     FileObservable.tailer()
               .file("/var/log/server.log")
               .startPosition(0)
               .sampleTimeMs(500)
               .chunkSize(8192)
               .utf8()
               .tailText();

<强> RxJava

有关使用JavaRx的原因的详细信息,请参阅RxJava project