Java 与另一进程通信时出现意外结果';s标准

Java 与另一进程通信时出现意外结果';s标准,java,python,bash,pipe,ipc,Java,Python,Bash,Pipe,Ipc,我的项目目录包含以下3个文件 rndbet/rndbet.py while True: s = input() if s == "exit": exit() else: print("I'm rndbet: " + s) rndbet/start python3 rndbet.py mjhd.java import java.io.PrintStream; import java.util.Scanner; public class

我的项目目录包含以下3个文件

rndbet/rndbet.py

while True:
    s = input()
    if s == "exit":
        exit()
    else:
        print("I'm rndbet: " + s)
rndbet/start

python3 rndbet.py
mjhd.java

import java.io.PrintStream;
import java.util.Scanner;

public class mjhd {
    public static void main(String[] args) throws Exception {
        Process process = new ProcessBuilder("bash", "-c", "cd rndbet&&./start").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Scanner in = new Scanner(process.getInputStream());
                while (in.hasNextLine()) {
                    System.out.println("<- rndbet: " + in.nextLine());
                }
            }
        }).start();
        Scanner in = new Scanner(System.in);
        PrintStream out = new PrintStream(process.getOutputStream(), true);
        while (true) {
            out.println(in.nextLine());
        } //this part is actually broken; it shouldn't be an infinite loop
          //just for testing
    }
}
但是运行java程序的行为不同

$ java mjhd
hi
<- rndbet: I'm rndbet: hi
exit
<- rndbet: I'm rndbet: exit
exit
<- rndbet: I'm rndbet: exit
$javamjhd
你好

好吧,我找到了一个简单的答案


更改out.println(in.nextLine())
to
out.print(in.nextLine()+'\n')
有效。

问题在于
PrintStream
和匿名线程正在运行,因此输出混乱。你为什么不把你的
PrintStream
放到匿名
线程中
打印出来?@haifzhan
PrintStream
不会打印出我代码中的任何内容;它相当于“发送”。
$ java mjhd
hi
<- rndbet: I'm rndbet: hi
exit
<- rndbet: I'm rndbet: exit
exit
<- rndbet: I'm rndbet: exit