1

我正在尝试写入子进程的标准输入(两者都是 Java 应用程序)。PrintStream读取进程的输出工作正常,但使用或输入不起作用PrintWriter。这是我编写的用于测试奇怪行为的示例程序,我在没有参数的情况下运行该程序。然后运行与子进程相同的程序。子进程只是读取输入并将其回显到输出中。主进程获取标准输入并将其写入子进程输入,并将子进程输出输出到标准输出。

麻烦的是,这行不通。子流程的与父流程中的语句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

这种事情的通常原因是缓冲问题。

在您的示例程序中,我看到了一个可能的问题:在子进程中,您正在执行System.out.println()但之后没有刷新。查阅Javadoc表示PrintStreams可能会自动刷新,但没有说明默认System.out是否如此配置,值得一试。

请注意,某些平台仅在它是终端时才决定自动刷新标准输出(我不知道 Java 是否System这样做),这可能会在调试时混淆问题。

(我确实注意到您说在实际情况下您不能更改子进程,但如果这是问题所在,那么您必须更改子进程(或者,如果有 is-a-terminal测试,将其包装在伪终端中)。)

于 2012-11-04T20:56:12.030 回答