我有一个 Python 应用程序和一个 Java 应用程序同时运行。 我希望 Java 启动 Python 进程,然后使用普通的 STDIN/STDOUT 流与 Python 进行通信。 我已经正确启动了该进程,并且有两个线程来处理两个 I/O 流。
输出线程:
class output2 extends Thread {
Process process;
OutputStream stdin;
BufferedWriter writer;
Scanner in = new Scanner(System.in);
output2(Process p) {
try {
process = p;
stdin = process.getOutputStream();
writer = new BufferedWriter(new OutputStreamWriter(stdin));
} catch (Exception e) {
System.out.println("ERROR output2(): " + e);
}
}
@Override
public void run() {
System.out.println("Starting OUTPUT THREAD");
try {
while (true) {
String input = in.nextLine();
writer.write(input);
writer.flush();
}
} catch (Exception e) {
System.out.println("ERROR output2_run(): " + e);
}
System.out.println("Ending OUTPUT THREAD");
}
}
输入线程:
class input2 extends Thread {
Process process;
InputStream stdout;
BufferedReader reader;
input2(Process p) {
try {
process = p;
stdout = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(stdout));
} catch (Exception e) {
System.out.println("ERROR input2(): " + e);
}
}
@Override
public void run() {
System.out.println("Started INPUT THREAD");
try {
while (true) {
System.out.println(Thread.currentThread().getName() + " is executing");
if (reader.readLine() != null) {
System.out.println("Stdout: " + reader.readLine());
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " stopped executing");
}
} catch (Exception e) {
System.out.println("ERROR input2_run(): " + e);
}
System.out.println("Ending INPUT THREAD");
}
}
主要:
public class My_Java {
public static void main(String args[]) {
File file = new File("C:\\Location\\");
try {
Process process = Runtime.getRuntime().exec("C:\\Python27\\python.exe chat_from_file.py", null, file);
input2 input = new input2(process);
output2 output = new output2(process);
input.setName("INPUT THREAD");
output.setName("OUTPUT THREAD");
input.start();
output.start();
} catch (Exception e) {
System.out.println("ERROR main(): " + e);
}
}
}
这似乎根本没有给出任何回应。 它启动两个线程,表示 INPUT THREAD 正在执行,但此后什么也没有执行。 我哪里出错了?
最佳答案
首先,在输入类中调用 if (reader.readLine() != null) {
后,您实际上已经读取了该行,下一次调用将返回 null
.
使用ready
检查非阻塞读取的可能性。不要预先阅读。
但是,我很确定您的进程存在异常,例如 python: can't open file 'chat_from_file.py': [Errno 2] No such file or directory
或者,抛出堆栈跟踪并退出。
使用getErrorStream
如果存在错误,检查进程输出的内容。这将使您走上解决问题的正确道路。
此外,为了以防万一,请确保确实有一些东西可供阅读。确保您的 Python 应用程序输出足够的数据以便刷新缓冲区(或刷新其写入)。
并且不要忘记干净、正确地加入和退出。祝你好运。
关于java - Python 和 Java 接口(interface) - 多线程输入和输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324993/