将 Java System.out 快速便捷地重定向到文件和控制台





5.00/5 (9投票s)
将 Java System.out 快速便捷地重定向到文件和控制台。
以下代码演示了一种非常简单的方法,可以将 Java System.out
和 System.err
流重定向到文件和控制台。
出于某种原因,在 Google 上搜索“Java stdout 重定向到文件和控制台”在最初的几个页面上并没有得到任何简单的答案。由于答案非常简单,我决定快速编写此方法,希望未来的程序员不必花费超过几分钟的时间来解决此类问题。
问题在于,如何使用 System.out
或 System.err
中的方法同时打印到文件和控制台,而无需采取荒谬的极端手段?简而言之,答案是将多个 OutputStream
包装到单个 OutputStream
类实现中,并在此实现上构造一个 PrintStream
实例,然后将此 PrintStream
实现设置到 System
中。
首先定义你的 MultiOutputStream
类
public class MultiOutputStream extends OutputStream
{
OutputStream[] outputStreams;
public MultiOutputStream(OutputStream... outputStreams)
{
this.outputStreams= outputStreams;
}
@Override
public void write(int b) throws IOException
{
for (OutputStream out: outputStreams)
out.write(b);
}
@Override
public void write(byte[] b) throws IOException
{
for (OutputStream out: outputStreams)
out.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException
{
for (OutputStream out: outputStreams)
out.write(b, off, len);
}
@Override
public void flush() throws IOException
{
for (OutputStream out: outputStreams)
out.flush();
}
@Override
public void close() throws IOException
{
for (OutputStream out: outputStreams)
out.close();
}
}
接下来构造你的 PrintStream
实例并将其设置到 System
try
{
FileOutputStream fout= new FileOutputStream("stdout.log");
FileOutputStream ferr= new FileOutputStream("stderr.log");
MultiOutputStream multiOut= new MultiOutputStream(System.out, fout);
MultiOutputStream multiErr= new MultiOutputStream(System.err, ferr);
PrintStream stdout= new PrintStream(multiOut);
PrintStream stderr= new PrintStream(multiErr);
System.setOut(stdout);
System.setErr(stderr);
}
catch (FileNotFoundException ex)
{
//Could not create/open the file
}
现在你可以尽情使用 System.out
或 System.err
写入任何内容,它将被写入控制台和文件
System.out.println("Holy Rusty Metal Batman! I can't believe this was so simple!");
System.err.println("God I hate you Robin.");
再见,祝你愉快!