新线程处理标准输出检测Success!时InputStreamReader参数错误如何修复
修复方案
核心问题说明
你遇到的参数类型不匹配只是表层报错,根本原因是System.out是PrintStream类型的输出流,作用是将程序内容向外写出到标准输出,本身没有读取已输出内容的能力,无法直接作为InputStreamReader的输入参数。
要实现逐行检测标准输出的Success!标记,需要先拦截标准输出的内容,再转发到可读取的流中供检测线程消费。
具体实现代码
第一步:构造代理流拦截标准输出
import java.io.*; public class StdoutMonitor { public static void main(String[] args) throws IOException { // 保存原始标准输出,避免丢失原有输出能力 final PrintStream originalStdout = System.out; // 构造管道流对:写入端代理标准输出,读取端供检测线程消费 PipedOutputStream pipeOut = new PipedOutputStream(); PipedInputStream pipeIn = new PipedInputStream(pipeOut); // 自定义代理PrintStream,同时向原始标准输出和管道写入内容 PrintStream proxyStdout = new PrintStream(pipeOut, true) { // true开启自动刷新 @Override public void println(String s) { originalStdout.println(s); super.println(s); } @Override public void print(String s) { originalStdout.print(s); super.print(s); } @Override public void write(byte[] buf, int off, int len) { originalStdout.write(buf, off, len); super.write(buf, off, len); } }; // 替换系统标准输出 System.setOut(proxyStdout);
第二步:启动检测线程读取管道内容
Thread monitorThread = new Thread(() -> { try (BufferedReader reader = new BufferedReader(new InputStreamReader(pipeIn))) { String line; while ((line = reader.readLine()) != null) { if (line.contains("Success!")) { // 匹配到目标字符串的处理逻辑 System.err.println("检测到成功标记:" + line); } } } catch (IOException e) { e.printStackTrace(); } }); monitorThread.start();
测试效果
// 正常输出内容即可被检测到 System.out.println("程序启动中..."); System.out.println("加载配置完成"); System.out.println("Success! 任务执行完成"); } }
注意事项
- 管道流默认有缓冲区大小限制,检测线程不要长时间阻塞,避免导致主流程输出卡住
- 如果后续不需要继续监控,可以调用
System.setOut(originalStdout)恢复原始标准输出 - 如果你的需求是监控外部子进程的标准输出,不需要拦截当前进程的System.out,直接调用子进程对象的
getInputStream()方法读取输出内容即可
内容的提问来源于stack exchange,提问作者Software Dev
相关产品推荐
相关产品推荐

