【问题标题】:How to capture all system.out.println to an array or list of string如何将所有 system.out.println 捕获到数组或字符串列表中
【发布时间】:2026-02-11 06:55:01
【问题描述】:

我试图弄清楚如何将所有 System.out.println 存储到字符串列表中,就像任何时候一样 System.out.println 被调用,它将被存储为 List 的一个元素。

我已经知道我们可以使用 System.setOut() 捕获 System.out.print。

提前谢谢你。

【问题讨论】:

  • 这能回答你的问题吗? Redirect console output to string in Java
  • 嗯我其实想把它作为List的一个元素来捕获
  • 您不能将其捕获为字符串,然后将其后处理为您最终想要的任何形式吗?您是否需要连续执行此操作,还是可以只进行一次转换,一旦您知道不需要捕获更多输出?
  • 我刚刚意识到我可能错过了您的要求。您想捕获来自println 的输出,而不是来自print 的输出?如果是这样,您应该知道println 函数有10 个重载。您必须尽可能多地重载它们,因为它们在当前实现中都调用print。如果您确实需要这样做,为什么不使用您自己代码中的一个或多个方法替换对println 的调用,而让 System.out 不理会呢? - 希望您真的想捕获所有内容,并且可以使用@IsmailDurmaz 的解决方案,这看起来很棒。
  • 是的,我想从println 捕获所有内容。我正在开发基于 java 应用程序的 UI。所以我的意图是从 system.out 捕获所有内容并将其传输到前端。感谢大家的支持。我会尝试@IsmailDurmaz 的解决方案

标签: java java-io


【解决方案1】:

System.out.println 方法有 printnewLine 方法。没有办法只捕获System.out.println 方法,您应该捕获所有System.out.print 方法并更改System.out 变量。

System.out.printlnjdk 实现:

    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

用于捕获System.out.print内容的文本收集器输出流类:

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class TextCollector extends OutputStream {
    private final List<String> lines = new ArrayList<>();
    private StringBuilder buffer = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        if (b == '\n') {
            lines.add(buffer.toString());
            buffer = new StringBuilder();
        } else {
            buffer.append((char) b);
        }
    }

    public List<String> getLines() {
        return lines;
    }
}

示例测试实现:

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        // store current output
        PrintStream tmpOut = System.out;

        // change stream into text collector
        TextCollector textCollector = new TextCollector();
        System.setOut(new PrintStream(textCollector));

        // collect lines
        System.out.println("Test-1");
        System.out.println("Test-2");

        // print lines to console
        System.setOut(tmpOut);
        List<String> lines = textCollector.getLines();
        for (String line : lines) {
            System.out.println(line);
        }
    }
}

【讨论】:

    【解决方案2】:

    这是一个简单的方法。只需为 println 覆盖尽可能多的类型即可打印。

    public class MyPrintStreamDemo extends PrintStream {
        static List<Object> list = new ArrayList<>();
        static PrintStream orig = System.out; 
        public MyPrintStreamDemo() {
            // any print method not overridden will print normally.
            // If you want to suppress non-overridden output
            // set the first argument below to PrintStream.nullOutputStream()
            super(System.out, true);
        }
        
        
        public static void main(String[] args) {
            System.setOut(new MyPrintStreamDemo());
            System.out.println("This is a test");
            System.out.println("And so is this");
            System.out.println(10);
            System.out.println(20.222);
            System.out.println(List.of(1,2,3,4));
            orig.println(list);
        }
        
        
        public void println(String s) {
            list.add(s);
        }
        public void println(double s) {
            list.add(s);
        }
        public void println(int s) {
            list.add(s);
        }
        public void println(Object s) {
            list.add(s);
        }
    }
    

    ArrayList 包含以下内容:

    [This is a test, And so is this, 10, 20.222, [1, 2, 3, 4]]
    

    【讨论】: