java - 使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL,尽管行数为 102

标签 java inputstream bufferedreader processbuilder

尝试从 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。

最佳答案

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

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

检查process.waitFor()的返回值。如果不是 0,那么就有问题了。您可能还想捕获进程的 stderr,因为它包含潜在的错误消息。一种简单的方法是使用 ProcessBuilder.redirectErrorStream(true) 将错误流重定向到输出流。

关于java - 使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL,尽管行数为 102,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57147864/

相关文章:

java - 迭代时向列表添加元素时出现 ConcurrentModiciationException

java - FileInputStream读取文件一直返回0

java - 如何从文件读取器中删除某些值(使用 ArrayList)?

Java 按字符读取文本文件 - unicode 254 和 255 突然出现

java - Rxjava链式多于一个请求

java - Android 版本 > 2.3 上的 FileNotFoundException

java - 用java管理文件读、保存、写

java - 通过 FilterInputStream 计算的文件大小比实际大小高 12.5%

java - 从InputStream读取直到双引号

android - 为什么我无法通过 Android ICS 中的 FileReader 正确读取/proc/net/xt_qtaguid/stats