gpt4 book ai didi

java - 写入 java 子进程

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:33 24 4
gpt4 key购买 nike

我正在尝试写入子进程的标准输入(都是java应用程序)。读取进程的输出工作正常,但使用 PrintStreamPrintWriter 输入不起作用。这是我编写的一个示例程序,用于测试奇怪的行为,我在没有参数的情况下运行该程序。然后,它作为子进程运行相同的程序。子进程只是读取输入并将其回显到输出中。主进程获取 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com