在文件和控制台中显示标准输出(使用System.setOut(new PrintStream(new File(“ output-file.txt”)))

时间:2019-01-10 10:16:04

标签: java java-ee

我要将标准输出保存到文件中。为此,我使用了
System.setOut(new PrintStream(new File("output-file.txt")));

现在,控制台中没有输出。

        try {
            System.setOut(new PrintStream(new File("output-file.txt")));
        } catch (Exception e) {
             e.printStackTrace();
        }

尽管我使用stdout填充文件,但是否有可能在控制台中显示stdout?

4 个答案:

答案 0 :(得分:2)

您可以使用同时进行两次写入的PrintWriter创建一个OutputStream

final OutputStream stdOut = System.out;
try {
    System.setOut(new PrintStream(new OutputStream() {
        private PrintStream ps = new PrintStream(new File("output-file.txt"));

        @Override
        public void write(int b) throws IOException {
            ps.write(b);
            stdOut.write(b);
        }

        @Override
        public void flush() throws IOException {
            super.flush();
            ps.flush();
            stdOut.flush();
        }

        @Override
        public void close() throws IOException {
            super.close();
            ps.close();
            // stdOut.close(); // Normally not done
        }
    }));
} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("Hello, world!");

答案 1 :(得分:1)

我从未尝试过,但是我想如果您将默认的Printstream子类化,则可以自己打印到控制台和文件。

类似:

class MyPrintStream extends printStream {

    private PrintStream secondPrinter;

    .....

    @Override 
    public void println(Object content) {
       super.println(content);
       secondPrinter.println(content);
    }
}

,也许这样称呼它:

System.out = new MyPrintStream(myFile, System.out);

答案 2 :(得分:0)

您不能使用系统OutputStream写入2个源。它是一个静态变量,它一次只能有1个值。

但是,您可以尝试保存对控制台默认值OutputStream的引用,然后将系统OutputStream更改为自定义输出流,并使用自定义方法将两者写入。

答案 3 :(得分:0)

您可以创建PrintStream类的新子类,然后重写它的方法以写入第二个Stream,然后将其传递给System.out,因为您已经拥有一个。 进一步的阅读和示例实现:https://books.google.ch/books?id=lbnjAwAAQBAJ&lpg=PA326&ots=j7OUeuXzIa&dq=java%20duplicate%20printstream&pg=PA326#v=onepage&q=java%20duplicate%20printstream&f=false