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
相关产品推荐
相关产品推荐

