2014-07-12 53 views
1

我有一個以交互方式在shell中工作的計算機代數程序(稱爲Reduce):在shell中啓動Reduce,然後可以定義變量,計算這個和那個以及不。 Reduce將輸出打印到外殼中。我的想法是,我想爲這個基於文本的程序構建一個前端,用於評估其輸出並將其轉換爲一個很好的LaTeX樣式公式。爲此,我想使用Java。通過Java控制命令行程序會話

我可以通過exec()啓動Reduce。但是,我怎樣才能模擬輸入到打開的shell的文本,以及如何讀回Reduce寫入shell的內容?

感謝 延

編輯1:目前代碼

// get the shell 
Runtime rt = Runtime.getRuntime(); 

// execute reduce 
String[] commands = {"D:/Programme/Reduce/reduce.com", "", ""}; 
Process proc = null; 
try { 
    proc = rt.exec(commands); 
} catch (Exception e) { 
    System.out.println("Error!\n"); 
} 

// get the associated input/output/error streams 
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
BufferedWriter stdOutput = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 

// read the output from the command 
System.out.println("Here is the standard output of the command:\n"); 
String s = null; 
try { 
    while ((s = stdInput.readLine()) != null) { 
     System.out.println(s); 
    } 
} catch (Exception e) { 
} 

// read any errors from the attempted command 
System.out.println("Here is the standard error of the command (if any):\n"); 
try { 
    while ((s = stdError.readLine()) != null) { 
     System.out.println(s); 
    } 
} catch (Exception e) { 
} 

回答

0

雖然這不是一個嚴格的答案,但我發現使用PHP的函數proc_open()更方便。這樣我可以將輸出直接包含在前端,不需要擔心我的Java程序和html前端之間的通信。

對於每個想要堅持Java方法的人來說:文章http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html是一個很好的參考。

1

你需要得到與包括的InputStream,OutputStream的,並且ErrorStream過程相關的數據流。然後,您可以通過OutputStream將消息發送到進程,然後通過InputStream和ErrorStream從進程讀取信息。

從我的一些代碼:

final ProcessBuilder pBuilder = new ProcessBuilder(TEST_PROCESS_ARRAY); 

    final Process proc = pBuilder.start(); 

    procInputStream = proc.getInputStream(); 
    errorStream = proc.getErrorStream(); 

    errorSBuffer = new StringBuffer(); 
    streamGobblerSb = new StreamGobblerSb(errorStream, "Autoit Error", errorSBuffer); 
    new Thread(streamGobblerSb).start(); 

    final Scanner scan = new Scanner(procInputStream); 
+0

謝謝,但我在Java文檔中找不到類StreamGobblerSb。我在哪裏可以找到它? – Jens

+0

@Jens:哦,對不起,這些只是我的Runnable類來處理流。您需要創建自己的Runnable來處理後臺線程中的Streams。 –

+0

好的,那麼這裏只是提到的StreamGobbler類? http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html。我想我意識到我需要線程,上面編輯1的代碼在成功啓動應用程序後掛起。 – Jens

0

你可能要考慮使用Process類。

http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

我相信你可以啓動程序,然後使用的getOutputStream()喂指令到過程。

+0

謝謝!看到我的編輯號碼。 1以上爲當前狀態。問題在於while循環在等待更多輸出時掛起...我可以把它放在一個線程中嗎? – Jens

+0

是的,你可以使用每個流的線程。以下是我見過的示例:http://stackoverflow.com/a/3350862 – oapeter

相關問題