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

新线程处理标准输出检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:03