java - 尽管行数为 102,但使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL
问题描述
尝试从 InputStream 打印行时,我得到一个 NULL。行数确实返回一个值,并且我打开的文件确实包含相同数量的行。
reader.readLine()
返回 NULL。
reader.lines().count()
确实返回文件中正确数量的行...
所以它让我相信:
- 该命令已成功执行。
- 该文件已打开并成功读取。
- 正在使用正确的流。IE
process.getInputStream()
我正在尝试使用 Java 运行一个 linux 命令,该命令将打开一个位于服务器上的文件并将其打印出来/记录到我的日志文件中。
我试过使用 ProcessBuiler 和Runtime.getRuntime.exec()
. 两者都产生相同的结果... NULL on reader.readLine()
。
一些帖子建议使用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。
解决方案
null
返回值 from表示readLine()
您已到达流的末尾。因此,您的过程不会产生任何输出。
如果文件实际上有一些内容,没有输出的最可能原因是您的子进程失败。例如,因为它找不到外壳,找不到文件,文件不可访问,...
检查 的返回值process.waitFor()
。如果这是除 0 之外的任何其他值,那么就有问题了。您可能还想捕获stderr
您的进程,因为它包含潜在的错误消息。一种简单的方法是使用 .将错误流重定向到输出流ProcessBuilder.redirectErrorStream(true)
。
推荐阅读
- java - 如何结合 GWT 和 Material Design Library w/o Maven?
- python - ValueError:未转换的数据仍然存在
- java - 为什么控制器需要在绑定错误上添加模型
- react-native - RN横拉刷新
- wordpress - 如何在 wordpress 结帐页面上更改货币?
- c# - web.config - 忽略特定文件夹的重写
- node.js - 在 Nodejs 中创建一个全局电子邮件功能
- python - Python包无法导入
- ios - 如何存储基于用户ID的图像上传
- java - 如何让 jersey 和 @webservlet 一起工作