从另一个过程中读取'输出流

时间:2012-08-14 17:06:19

标签: java process stream

我想在我的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();
    }
}

}

2 个答案:

答案 0 :(得分:3)

stdout被缓冲,如果您没有写入屏幕,则不会自动刷新。添加:

fflush(stdout);

后:

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

答案 1 :(得分:1)

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

 new InputStreamReader(process.getInputStream()); 

应该是

 new InputStreamReader(process.getOutputStream());

 new InputStreamReader(process.getErrorStream());