【问题标题】:Java "tail -f" wrapperJava "tail -f" 包装器
【发布时间】:2010-11-02 13:34:36
【问题描述】:

我需要将 Unix 命令“tail -f”包装在 BufferedInputStream 中。我不想像this question 所说的那样模拟或模仿尾巴。相反,我想使用tail,等待它给我一个新行。

【问题讨论】:

    标签: java unix tail


    【解决方案1】:

    最好的办法是使用Process 类并使用Scanner 阅读:

    Runtime r = Runtime.getRuntime()
    Process p = r.exec("tail -f")
    Scanner s = new Scanner(p.getInputStream())
    while (s.hasNextLine()) {
        String line = s.nextLine()
        // Do whatever you want with the output.
    }
    

    hasNextLine() 应该阻塞,因为它正在等待来自输入流的更多输入,因此您不会在数据进入时忙于等待。

    【讨论】:

    • 唯一的问题是最后需要换行符
    【解决方案2】:

    查看 Runtime.exec(String command)。返回具有输入和输出流的 Process 对象。

    【讨论】:

    • 这似乎是我正在寻找的。我会试试这个,谢谢。
    【解决方案3】:

    还要检查ProcessBuilder

    Process tail = new ProcessBuilder("tail", "-f", file).start();
    BufferedInputStream bis = new BufferedInputStream(tail.getInputStream())
    

    其中file 是类似“/var/log/messages”的字符串。

    【讨论】:

      【解决方案4】:

      我猜 system() 和 popen() 类型的方法不会起作用,因为它们会阻塞你的程序,直到 tail 命令终止。

      我认为您可以将输出重定向到一个文件并针对上一个版本使用“diff”来查看哪些行是新的?

      【讨论】:

        【解决方案5】:

        如果你有 unix 命令

        tail -f <file> | <some java program>
        

        然后尾部会显示为InputStream,可能会阻塞一段时间。如果您不想阻止自己,则可以使用 nio 包。我相信大多数其他访问tail命令的方法(例如Process)都会导致类似的InputStream

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 2011-02-19
          • 2015-09-16
          • 2015-08-03
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多