2015-09-14 59 views
0

有我的問題,我有一個.BAT誰不得不做的事:爪哇 - 調用Runtime.getRuntime()EXEC()關鍵事件

@echo off 
echo "Hello world!" 
pause 

我的回答是,有沒有辦法趕上事件當Java程序使用 Runtime.getRuntime()。exec(FullCommand)「Press Any Key」(來自外部程序)?

在我的Java代碼中,我使用所有的通量(的InputStream,OutputStream中,errorstream,到單獨的線程) 和我已經tryed趕上了的BufferedReader行,但「按任意鍵」不來,如果我不使用我的輸出流模擬按鍵輸入newLine();,因爲過程不想完成。

所以我想知道是否有一個技巧知道什麼時候進程等待或者是否有辦法在輸入key方法之前捕獲輸入流「按任意鍵」之後使用outputstream方法(因爲我不'我想運行所有腳本都使用這種方法)。

1)Run Exec

proc = Runtime.getRuntime().exec(FullCommand); 
try { 
Ti = new Thread(new DisplayInputStream(proc.getInputStream())); 
Te = new Thread(new DisplayDebugStream(proc.getErrorStream())); 

Ti.start(); 
Te.start(); 

proc.waitFor(); 
Ti.join();              
Te.join(); 
} 
...... 

2)InputStream方法

BufferedReader br = getBufferedReader(inputStream); 
setInfosProcess(null); 
try { 
    while ((StrInprocess = br.readLine()) != null) { 
     if(???) //Condition Press Event key 
     { 
      Thread To; 
      To = new Thread(new DisplayOutputStream(proc.getOutputStream())); 
      To.start(); 
     } 
     if (getInfosProcess() == null) { 
      setInfosProcess(StrInprocess + "\n"); 
     } else { 
      setInfosProcess(getInfosProcess() + StrInprocess + "\n"); 
     } 
    } 
} 
...... 

3)OutputStream方法

BufferedWriter bwr = getBufferedWriter(outputStream); 
     setOutputProcess(null); 

     try { 
      bwr.newLine();// Simulate pressing of the Enter key 
      bwr.flush();// Flush the stream, otherwise it doesn't work 
     } 
     ...... 

調試

 run: 
     Hello world! Test:-1 //To compare string with what i want 
     //"Press Any Key" from pause don't come 
     //infinite loop caused by **pause** 

泰的任何幫助。

回答

0

可以讀取它通過字符(或一次一組字符)字符,而不是逐行。

BufferedReader br = getBufferedReader(inputStream); 
setInfosProcess(null); 
char[] cbuf = new char[1024]; // Adjust the length of the array to suit your needs. 
StringBuilder outputBuilder = new StringBuilder(); 
try { 
    while ((StrInprocess = br.read(cbuf)) != -1) { 
     outputBuilder.append(cbuf); // You will get the "Press Any Key" text as soon as it appears. 
     // Whatever you want to do here with the outputBuilder object... 
    } 
} 
+0

嗨,問題在於進程等待按鍵來繼續他必須做的事情(在這種情況下退出),因此緩衝區在我使用輸出方法之前無法讀取暫停的「按任意鍵」,並且這真的很奇怪。 – Adhin37

+0

你試過我的回答嗎?你還沒有得到'Press Any Key'文本? – Codebender

+0

是的還是一樣的。 – Adhin37

0

你必須聽閱讀java.awt.event.KeyListener按鍵

f.addKeyListener(new KeyListener() { 
    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar()); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 
}); 
+0

我不認爲這是什麼OP是要求 –

+0

的KeyListener會抓住我的鍵按下,但它不是我想要的,我只是想抓住從誰說,我需要按外部程序的輸入一些東西。 – Adhin37