2

Java プログラムで c-Application の出力ストリームを読みたかったのです。iremoted (ここで入手可能: http://osxbook.com/software/iremoted/download/iremoted.c ) は、Apple Remote のボタンが押された場合に「0x19 が押されました」のような別の行を出力する C アプリケーションです。iremoted プログラムを起動すると、すべてがうまくいき、ボタンを押すたびにこれらの別々の行が画面に表示されます。ここで、Java プロジェクトで Apple Remote の入力を処理するために、Java アプリケーションで C アプリケーションの出力ストリームを読み取りたいと考えました。残念ながら、入力が認識されない理由がわかりません。

簡単な 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();
    }
}

}
4

2 に答える 2

3

stdout画面に書き込んでいない場合はバッファリングされ、自動的にフラッシュされません。追加:

fflush(stdout);

後:

printf("%#lx %s\n", (UInt32)event.elementCookie,
    (event.value == 0) ? "depressed" : "pressed");
于 2012-08-14T17:20:47.823 に答える
1

hello world プログラムが機能している場合、iremoted は stderr に書き込みを行っている可能性があります。その場合、エラーストリームが必要になります。これがあなたのハローワールドのケースでどのように機能するかわかりません-ここで間違ったことをしていると思います:

 new InputStreamReader(process.getInputStream()); 

する必要があります

 new InputStreamReader(process.getOutputStream());

また

 new InputStreamReader(process.getErrorStream());
于 2012-08-14T17:13:35.207 に答える