如何使用ProcessBuilder与CLI程序持续交互

问题描述 投票:-1回答:1

我定期使用CLI程序,该程序可通过docker容器进行访问。输入容器后,就可以开始使用有问题的CLI程序了。我遇到的问题是我想继续与同一命令行实例进行交互。基本上,我试图创建一个将在CLI程序“顶部”运行的GUI程序。我只是不知道如何继续向同一CLI实例发送命令:

List<String> command = new ArrayList<String>();
command.add("cmd.exe" );
command.add("/c");
command.add("docker-compose up -d");
System.out.println(command);

ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Map<String, String> environ = builder.environment();

Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}
command.clear();
command.add("cmd.exe" );
command.add("/c");
command.add("docker ps");
System.out.println(command);

process = builder.start();
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

但是这并没有达到我想要的方式。在上面,您将看到我正在运行两个命令:docker-compose up -d,然后是docker ps。但是我不认为它们在同一实例中运行。因此,如果我要在第一个命令中更改目录,就不会记住第二个命令的目录。

而且,似乎我的命令以与代码中的顺序相反的顺序运行。

java processbuilder
1个回答
0
投票

我认为ProcessBuilder类的实例是短期的。我不认为每次要创建新进程都创建一个新实例都会浪费内存或其他资源-但我只是在猜测。

无论如何,要重复使用ProcessBuilder实例以执行多个进程,只需使用其方法,例如command(String...)

我编写了一个小的Swing应用程序,该应用程序让用户输入[operating system]命令并显示该命令的输出。还没有准备好[[production,但我希望它足以使您前进。

注意,用Java代码创建和处理command(String...)既不简单也不直观。文章Process对我有很大帮助。这是一篇古老的文章,但仍然有意义(再次,我认为)。只需将文章中对类Process的引用替换为类When Runtime.exec() won't,因为该文章是在Runtime添加到JDK之前编写的。

这里是我的应用代码。请参阅上述文章,以了解ProcessBuilder相关代码。为了理解

Swing

代码,我建议使用教程ProcessBuilderProcessBuilder
© www.soinside.com 2019 - 2024. All rights reserved.