You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python向Java进程管道输入数据,Java无法接收问题求助

问题分析与解决方案

核心问题是Python的管道输出缓冲区未主动刷新,导致写入的行数据滞留在缓冲区中,没有传递到Java进程的标准输入流,因此Java的readLine()无法接收到完整的行数据,一直处于等待状态。

解决方法

方法1:每次写入后手动刷新缓冲区

在调用write()后,立即调用flush()强制将缓冲区数据发送给Java进程:

from subprocess import Popen, PIPE
import time

command = ['java', '-jar', 'myprogram.jar']
p = Popen(command, stdin=PIPE)
time.sleep(10)
print("Process opened and waiting input\n\n\n")
for word in ['foo', 'bar', 'baz']:
    try:
        p.stdin.write(word.encode() + b'\n')
        p.stdin.flush()  # 关键:刷新缓冲区
    except Exception as e:
        print(e)
# 如果后续不再输入,可以关闭stdin,也会触发刷新
# p.stdin.close()

方法2:创建进程时禁用缓冲区

在Popen中设置bufsize=0,让管道无缓冲,写入的数据会立即发送:

from subprocess import Popen, PIPE
import time

command = ['java', '-jar', 'myprogram.jar']
# bufsize=0 表示无缓冲
p = Popen(command, stdin=PIPE, bufsize=0)
time.sleep(10)
print("Process opened and waiting input\n\n\n")
for word in ['foo', 'bar', 'baz']:
    try:
        p.stdin.write(word.encode() + b'\n')
    except Exception as e:
        print(e)

补充说明

  • Java代码中的外层while(true)是冗余的,内层while ((line = in.readLine()) != null)已经会循环读取所有输入直到EOF,不过这不会影响当前的stdin通信问题。
  • time.sleep(10)是为了确保Java进程完全启动,如果你的Java程序启动很快,可以缩短这个时间甚至移除。

内容的提问来源于stack exchange,提问作者user8845408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:22:38