java - Java ProcessBuilder 从 Linux 终端命令获取输出
问题描述
我想用java代码与linux终端通信。我想存储输出并使用它。我按照给定链接中的说明实现了以下代码。
我希望得到帮助的完整终端输出。但无论是对于标准命令,还是对于 mosquitto 命令,我都不会从输入流中得到任何东西。错误在哪里?或者你应该做完全不同的事情?
Stackoverflow 链接:如何从 java 程序在终端运行命令?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class LinuxInputStream
{
public static void main(String[] args)
{
// Linux Terminal
String prefix = "/bin/bash";
String terminalCommand = "help";
String mosquittoCommand = "mosquitto --help";
ProcessBuilder pb1 = new ProcessBuilder(
new String[] {prefix, terminalCommand});
ProcessBuilder pb2 = new ProcessBuilder(
new String[] {prefix, mosquittoCommand});
try
{
executeCommand(pb1);
}
catch (IOException e)
{
System.out.println("IO Error in Terminal Command execution!");
e.printStackTrace();
}
try
{
executeCommand(pb2);
}
catch (IOException e)
{
System.out.println("IO Error in Mosquitto Command execution!");
e.printStackTrace();
}
}
private static void executeCommand(ProcessBuilder pb) throws IOException
{
Process terminalCommandProcess = pb.start();
InputStream inputStream = terminalCommandProcess.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(inputStream));
String line;
int i = 0;
while ((line = br.readLine()) != null)
{
System.out.println("Line: " + line);
i++;
}
if (i == 0) System.out.println("Nothing read from input stream");
}
}
输出:
没有从输入流中
读取 没有从输入流中读取
解决方案
刚刚在发布后立即找到了解决方案:缺少“-c”部分。正确的代码片段是:
// Linux Terminal
String prefix = "/bin/bash";
String c = "-c";
String terminalCommand = "help";
String mosquittoCommand = "mosquitto --help";
ProcessBuilder pb1 = new ProcessBuilder(
new String[] {prefix, c, terminalCommand});
ProcessBuilder pb2 = new ProcessBuilder(
new String[] {prefix, c, mosquittoCommand});
推荐阅读
- ios - 将数据从 Tableview 传递到 CollectionView SWIFT
- ios - Objective-C:我想比较/排序块中的数组
- ios - AdMob EU Consent SDK iOS 错误:同意表单只能与自定义提供商选择一起使用
- keycloak - Keycloak 模板可用变量
- java - 如何在java中裁剪图像?
- jquery - 导出模块中未触发 jquery 更改事件
- c# - GeoCoordinateWatcher 如何获取位置 C#
- angular - 如何通过在Angular4中将localStorage值作为参数传递来调用API url
- c++ - 确定用户是否可以使用 c++ 提升进程
- selenium - appium中的水平滚动