【问题标题】:Using ProcessBuilder to execute Linux Command and getting NULL from reader.readLine() although line count is 102尽管行数为 102,但使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL
【发布时间】:2019-11-30 12:55:14
【问题描述】:

尝试从 InputStream 打印行时,我得到一个 NULL。 行数确实返回一个值,并且我打开的文件确实包含相同数量的行。

reader.readLine() 返回 NULL。

reader.lines().count() 确实返回文件中正确数量的行...

所以这让我相信:

  1. 命令执行成功。
  2. 文件已成功打开并读取。
  3. 正在使用正确的流。即process.getInputStream()

我正在尝试使用 Java 运行一个 linux 命令,该命令将打开位于服务器上的文件并将其打印出来/记录到我的日志文件中。

我尝试过使用 ProcessBuiler 和 Runtime.getRuntime.exec()。两者都产生相同的结果...reader.readLine() 上的 NULL。

一些帖子建议使用process.getOutputStream。它返回 0 行数和空行。

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("sh", "-c", "cat chris.txt");
processBuilder.directory(new File("/opt/tmp/FOLDER_NAME"));
Process process = processBuilder.start();

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

StringBuilder stringBuilder = new StringBuilder();

String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
logger.info("######### {}", line);
}

我希望将我的文件内容打印到我的日志文件中。

我在 reader.readLine() 对象上得到一个 NULL。

【问题讨论】:

  • 当然:stringBuilder.append(line).append("\n"); 因为line 被剥夺了任何行分隔符。
  • 是的。但首先我需要 reader.readLine() 不返回 null。

标签: java inputstream bufferedreader processbuilder


【解决方案1】:

来自readLine()null 返回值表示您已到达流的末尾。因此,您的流程不会产生任何输出。

如果文件实际上有一些内容,没有输出的最可能原因是您的子进程失败。比如找不到shell,找不到文件,文件不可访问,...

检查process.waitFor()的返回值。如果这是除 0 之外的任何其他值,那么就有问题了。您可能还希望捕获进程的stderr,因为其中包含潜在的错误消息。一个简单的方法是使用ProcessBuilder.redirectErrorStream(true) 将错误流重定向到输出流。

【讨论】:

  • 谢谢。我知道 null 应该意味着我已经到达了流的末尾,但是,我已经到达了流的末尾是没有意义的。运行 shell 命令并找到文件。我知道这一点,因为 reader.lines().count() 返回文件中的确切行数。我已经重定向了错误流,也没有任何反应。
【解决方案2】:

我找到了问题... 似乎我在使用行之前通过进行行数来用完流。

对另一个帖子的评论帮助我找到了这个...

“while 和 for 的行为本质上是相同的;你的 while 从未“返回”的原因可能是由于你在 countlines() 方法中“耗尽”了流。”

【讨论】:

  • 我在您发布的代码示例中没有看到任何行计数代码?我刚刚在这里尝试了您的代码示例,它工作正常。
猜你喜欢
  • 2011-04-16
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2014-02-10
  • 2014-03-14
相关资源
最近更新 更多