如何将所有system.out.println捕获到一个数组或字符串列表

am46iovg  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(356)

我正在尝试找出如何将所有system.out.println存储到一个字符串列表中,就像任何时候调用system.out.println时,它都将存储为list的一个元素。
我已经知道我们可以使用system.setout()捕获system.out.print。
先谢谢你。

z31licg0

z31licg01#

这里有一个简单的方法。只需重写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]]
c86crjj0

c86crjj02#

System.out.println 方法有 print 以及 newLine 方法。没有办法只捕获 System.out.println 方法,你应该捕获所有 System.out.print 有变化的方法 System.out 变量。 System.out.println jdk实现:

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);
        }
    }
}

相关问题