如何在LINUX上用Java实时读取文本文件



我把'ON LINUX'大写不是为了惹恼你,而是因为我已经能够在Windows上使用3个不同的文件读取类做到这一点。FileIntputStreamBufferedReaderRandomAccessFile(后两点我很确定,但前两点可能是错的——我的记忆力太差了。)所有这些对我来说都是完美的。我使用这些读取器的目的是实时逐行读取文本文件,也就是说,当这个文件的新版本被保存并附加了新行时,java程序读取这一行,对它做一些操作,然后继续检查另一行。

我尝试使用Java 7 openJDK, Java 7 Oracle和Java 8 Oracle环境进行编译,所有结果。jar在windows上运行良好,并且由于Java是跨平台的,我认为它们也可以在Linux上工作(对吧?),然而我编译的每个版本在Linux上测试时都失败了。这是由一个运行linux Red Hat的社区论坛成员引起我的注意,没有错误/异常,看起来像在运行,但就是不工作。我今天安装了Ubuntu,并亲自试用了一下:阅读器可以很好地读取原始文件,但不能实时"流式传输"文件。对文件的更改不会被注意到。我很困惑这是怎么可能的,老实说,我很惊讶它没有在任何地方被提起(据我所知,哈哈)。希望这意味着我在确保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();
    }
}

尾矿文件

要获得像tail -f这样的功能,您的解决方案正在监视新文件更新,然后使用它们做一些事情,请参阅以下答案:我如何跟踪像"Tail -f"在Java中无需保持文件打开(防止重命名/删除)。它的来源对您正在尝试的内容提供了信息。我怀疑一些搜索绕过了你所看到的问题。尾随者源

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

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项目

相关内容

  • 没有找到相关文章

最新更新