从另一个进程的输出流中读取

我想在我的Java程序中读取c-Application的输出流。 iremoted (可在此处获取: http : //osxbook.com/software/iremoted/download/iremoted.c )是一个C-Application,如果按下Apple Remote遥控器上的按钮,它会输出单独的行,例如“0x19被按下”。 如果我启动iremoted程序,一切都很顺利,每次按下按钮,这些单独的行都显示在我的屏幕上。 现在我想在我的Java应用程序中读取c-application的输出流来处理Java项目中Apple Remote的输入。 不幸的是,我不知道为什么没有投入资产

我尝试使用一个简单的HelloWorld.c程序,我的程序在这种情况下按预期响应(打印出HelloWorld)。

为什么它不适用于iremoted计划?

public class RemoteListener { public void listen(String command) throws IOException { String line; Process process = null; try { process = Runtime.getRuntime().exec(command); } catch (Exception e) { System.err.println("Could not execute program. Shut down now."); System.exit(-1); } Reader inStreamReader = new InputStreamReader(process.getInputStream()); BufferedReader in = new BufferedReader(inStreamReader); System.out.println("Stream started"); while((line = in.readLine()) != null) { System.out.println(line); } in.close(); System.out.println("Stream Closed"); } public static void main(String args[]) { RemoteListener r = new RemoteListener(); try { r.listen("./iremoted"); /* not working... why?*/ // r.listen("./HelloWorld"); /* working fine */ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

stdout是缓冲的,如果你没有写入屏幕,它不会自动刷新。 加:

 fflush(stdout); 

后:

 printf("%#lx %s\n", (UInt32)event.elementCookie, (event.value == 0) ? "depressed" : "pressed"); 

如果一个问候世界计划有效,iremoted可能会写入stderr。 在这种情况下,您会想要错误流。 我不确定这对你的hello world案例有何影响 – 我认为你在这里做错了:

  new InputStreamReader(process.getInputStream()); 

应该

  new InputStreamReader(process.getOutputStream()); 

要么

  new InputStreamReader(process.getErrorStream());