簡體   English   中英

Java:與命令行應用程序通信

[英]Java: Communicating with a command line application

我想用Java編寫國際象棋GUI。 用戶可以輸入一個動作,然后我希望程序進行一個動作。 因此,我將使用UCI(通用國際象棋界面)。 UCI是一種終端/命令行應用程序(我正在使用Mac OS X和Terminal),它可以計算位置的最佳移動。 現在,我需要做的是對該終端應用程序進行讀寫操作。

例如:我想要某個位置的最佳移動,所以我輸入:“ go ”(計算最佳移動)

假設我得到了這個答案:“ e2e4 ”(意味着將Pawn(在國際象棋中是一塊棋子)從e2正方形移到e4正方形)

現在,我需要閱讀“ e2e4”,然后要求用戶進行下一步操作。 因此,我有點需要一直循環通過這些步驟,直到出現一個將死的人:1.要求采取行動2.計算最佳響應

我已經看過許多其他StackOverflow問題,都提出了相同的問題:如何在命令行/終端中運行命令並獲取其輸出。 但是所有答案僅使用一個命令,例如runtime.exec("ls"); 但這只是一個命令。 我想要的是輸入命令,獲取響應,執行另一個命令等等,所以基本上我需要與Mac OSX的Terminal應用程序通信(交替輸入和輸出)。 如何在Java中完成?

您可以執行運行國際象棋程序的命令,然后檢查命令輸出的最佳動作(使用Process )。

例如:

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.

只需查找Runtime.exec()的返回類型。 它返回一個java.lang.Process

它提供了兩種輸入和輸出流方法: getOutputStream()和getInputStream()

您可以讀寫打開的ex進程。 與BufferedReaders / BufferedWriters一起使用。

例如:(另請參見https://stackoverflow.com/a/14745245/2358582

import java.io.*;

public class c {
    public static void main(String[] args) throws Exception{
        Process p = Runtime.getRuntime().exec("cmd");
        BufferedReader inp = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

        //communication
        setUpStreamGobbler(p.getInputStream(), System.out);
        out.write("cmd\n");
        out.flush();
    }

    public static void setUpStreamGobbler(final InputStream is, final PrintStream ps) {
        final InputStreamReader streamReader = new InputStreamReader(is);
        new Thread(new Runnable() {
            public void run() {
                BufferedReader br = new BufferedReader(streamReader);
                String line = null;
                try {
                    while ((line = br.readLine()) != null) {
                        ps.println("process stream: " + line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

輸出:

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:

我相信這個問題可能會對您有所幫助: 我問了類似的問題 ,希望這可以回答您的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM