我正在尝试写入子进程的标准输入(都是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();
}
}
}
}
最佳答案
此类问题的常见原因是缓冲问题。
在您的示例程序中,我看到一个可能的问题:在子进程中,您正在执行 System.out.println() ,但之后没有刷新。查阅Javadoc表明PrintStream
可能会自动刷新,但没有指定默认的System.out
是否如此配置,因此值得一试。
请注意,某些平台仅在终端是终端时才决定自动刷新 stdout(我不知道 Java System
是否这样做),这可能会在调试时造成困惑。
(我确实注意到您说在实际情况下无法更改子进程,但如果这就是问题所在,那么您必须更改子进程(或者,如果有 is-a-terminal 测试,请将其包装在伪终端中)。
关于java - 写入 java 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13221887/