java - 写入 java 子进程

标签 java subprocess java.util.scanner printwriter printstream

我正在尝试写入子进程的标准输入(都是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/

相关文章:

python - 在 py2exe 中打开 PyGTK Python 模块错误

python - 当它调用的进程尚未发出换行符时,是否有一种方法可以从 subprocess.Popen 的实例中读取字符?

java - 在 for 循环内使用 Scanner 进行系统输入

java.util.NoSuchElementException - 扫描仪读取用户输入

Java 线程 - 获取 ServerSocket 输入来更新 Swing

java - Java 中的 "logger"是什么?

python - 使用 python subprocess.check_output 进行实时管道或解决方法?

java - 如何扫描由空格分隔的一行 2 个数字并将每个数字的每个数字分配给一个 int?

java - 如何实现父类(super class)对象转换为子类对象的效果?

java - 从 C# 编辑 Java 应用程序的内存