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

Java如何通过OutputStream向子进程Scanner多次传递值

问题原因

Scanner.next()方法默认以空白字符(空格、换行、制表符等)作为输入分隔符,你当前代码直接将三个参数的字节拼接写入子进程输入流,最终传入的内容是拼接后的01asdasd,第一次调用next()就会读取完整段内容,后续两次调用无剩余有效输入,直接跳过。

修复方案

修改runApp方法中写入参数的逻辑,每次写入参数后追加空白分隔符即可,示例修改代码如下:

// 原循环逻辑
for (int i = 0; i < args.length; i++) {
    dos.writeBytes(args[i]);
}

// 修改后:每次参数后追加换行符作为分隔符
for (int i = 0; i < args.length; i++) {
    dos.writeBytes(args[i]);
    dos.writeBytes("\n");
}

优化建议

为避免不同系统环境下字符编码不一致导致的乱码问题,建议替换DataOutputStream为指定编码的OutputStreamWriter:

import java.nio.charset.StandardCharsets;
import java.io.OutputStreamWriter;

// 替换原OutputStream相关代码
OutputStream fos = process.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);  
            
for (int i = 0; i < args.length; i++) {
    osw.write(args[i]);
    // 用系统对应换行符兼容性更好
    osw.write(System.lineSeparator());
}

osw.flush();
osw.close();

修改完成后重新运行,App类中的str、str2、str3即可分别获取到传入的0、1、asdasd三个值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:11