Java:与命令行应用程序通信

Java:与命令行应用程序通信,java,macos,io,terminal,communication,Java,Macos,Io,Terminal,Communication,我想用Java编写一个象棋GUI。用户可以输入移动,然后我希望程序进行移动。因此,我将使用UCI(通用国际象棋界面)。UCI是一个终端/命令行应用程序(我使用的是Mac OS X和终端),用于计算某个位置的最佳移动。现在我需要做的是写入和读取这个终端应用程序 例如: 我想要某个职位的最佳移动,因此我键入: “go”(计算最佳移动) 假设我得到了这个答案: “e2e4”(指将棋子(国际象棋中的一块棋子)从e2方块移动到e4方块) 现在我需要阅读“e2e4”,然后询问用户的下一步行动。所以我需要一直

我想用Java编写一个象棋GUI。用户可以输入移动,然后我希望程序进行移动。因此,我将使用UCI(通用国际象棋界面)。UCI是一个终端/命令行应用程序(我使用的是Mac OS X和终端),用于计算某个位置的最佳移动。现在我需要做的是写入和读取这个终端应用程序

例如: 我想要某个职位的最佳移动,因此我键入: “
go
”(计算最佳移动)

假设我得到了这个答案: “
e2e4
”(指将棋子(国际象棋中的一块棋子)从e2方块移动到e4方块)

现在我需要阅读“e2e4”,然后询问用户的下一步行动。所以我需要一直循环这些步骤,直到有一个将死: 1.要求搬家 2.计算最佳响应


我已经看到很多其他StackOverflow问题都在问同样的问题:如何运行命令并在命令行/终端中获取其输出。但所有答案只使用一个命令,例如
runtime.exec(“ls”)但这只是一个命令。我想要的是输入一个命令,获得响应,执行另一个命令等等,所以基本上我需要与MacOSX的终端应用程序通信(交替输入和输出)。在Java中如何实现这一点?

只需查找Runtime.exec()的返回类型。它返回一个

它为输入和输出流提供了两种方法:和getInputStream()

您可以使用BufferedReaders/BufferedWriter读取和写入已打开的进程

例如:(另见)

产出:

process stream: Microsoft Windows [Version 6.1.7601]
process stream: Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalte
n.
process stream:
process stream: P:\Java\ExcecuteFile>cmd
process stream: Microsoft Windows [Version 6.1.7601]
process stream: Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalte
n.
process stream:

您可以执行运行chess程序的命令,然后检查命令的输出以获得最佳移动(使用
过程

例如:

String move = null;
Process process = Runtime.getRuntime().exec("go");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getOutputStream()));
move = reader.readLine();
// 'move'  now holds a reference to the chess program's output, or null if there was none.

我相信这个问题可能会帮助你: ,
我希望这将回答您的问题

这不起作用,Intellij IDEA会标记此错误:错误:(16,30)java:找不到适合BufferedReader(java.io.OutputStreamWriter)构造函数的构造函数java.io.BufferedReader.BufferedReader(java.io.Reader)不适用(实际参数java.io.OutputStreamWriter无法通过方法调用转换转换为java.io.Reader)构造函数java.io.BufferedReader.BufferedReader(java.io.Reader,int)不适用(实际参数列表和形式参数列表长度不同)我发现错误:代码中应该是BufferedWriter现在一切正常,我如何将结果输出到控制台?(使用System.out.println()?)始终尝试在发布前思考:)是的,您可以使用System.out.println(buf)输出它;不,但它不工作,out.write(“命令”)未执行
String move = null;
Process process = Runtime.getRuntime().exec("go");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getOutputStream()));
move = reader.readLine();
// 'move'  now holds a reference to the chess program's output, or null if there was none.