1

サブプロセスの stdin に書き込もうとしています (どちらも Java アプリです)。PrintStreamプロセスの出力の読み取りは正常に機能しますが、またはを使用した入力は機能しませんPrintWriter。これは、私が引数なしで実行する奇妙な動作をテストするために書いたサンプル プログラムです。次に、同じプログラムをサブプロセスとして実行します。サブプロセスは、入力を読み取り、それを出力にエコーするだけです。メイン プロセスは stdin を受け取り、それをサブプロセスの入力に書き込み、サブプロセスの出力を stdout に出力します。

問題は、これが機能しないことです。サブプロセスのは親プロセスnextLine()のステートメントと一致しないため、サブプロセスは何も出力しません。println()

なぜこれが起こっているのですか、どうすれば修正できますか(メインプロジェクトの子プロセスを変更できないため、できれば親プロセスで)。

import java.lang.*;
import java.io.*;
import java.util.Scanner;

public class ProcTest{
    public static Scanner stdin;
    public static String line;
    public static Process sub;

    public static BufferedReader childout;
    public static PrintWriter childin;

    public static void main(String[] args){
            stdin = new Scanner(System.in);
            if(args.length > 0 && args[0].equals("y")){
                    while(true){
                            line = stdin.nextLine();
                            System.out.println(line);
                    }
            }else{
                    try{
                            sub = Runtime.getRuntime().exec("java ProcTest y");
                            childout = new BufferedReader(new InputStreamReader(sub.getInputStream()));
                            childin = new PrintWriter(sub.getOutputStream());
                            while(true){
                                    childin.println(stdin.nextLine());
                                    childin.flush();
                                    while(childout.ready()) System.out.println( childout.readLine() );
                            }
                    }catch(IOException e){
                            e.printStackTrace();
                    }
            }
    }
}
4

1 に答える 1

1

この種の通常の原因は、バッファリングの問題です。

あなたのサンプルプログラムでは、考えられる問題が1つあります。子プロセスでは、実行していますが、System.out.println()後でフラッシュしていません。Javadoc をPrintStream調べると、 s が自動フラッシュする可能性があることが示されていますが、デフォルトSystem.outがそのように構成されているかどうかは指定されていないため、試してみる価値があります。

一部のプラットフォームでは、標準出力が端末の場合にのみ自動フラッシュされることに注意してください (Java がそうするかどうかはわかりませんSystem)。これにより、デバッグ時に問題が混乱する可能性があります。

(実際の状況では子プロセスを変更できないと言ったことに気づきましたが、これが問題である場合は子プロセスを変更する必要があります(または、is-a-terminalがある場合テスト、疑似端末でラップします))

于 2012-11-04T20:56:12.030 に答える