65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2012年1月17日

CPOL
viewsIcon

157313

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

以下代码演示了一种非常简单的方法,可以将 Java System.outSystem.err 流重定向到文件和控制台。

出于某种原因,在 Google 上搜索“Java stdout 重定向到文件和控制台”在最初的几个页面上并没有得到任何简单的答案。由于答案非常简单,我决定快速编写此方法,希望未来的程序员不必花费超过几分钟的时间来解决此类问题。

问题在于,如何使用 System.outSystem.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.outSystem.err 写入任何内容,它将被写入控制台和文件

System.out.println("Holy Rusty Metal Batman! I can't believe this was so simple!");
System.err.println("God I hate you Robin.");

再见,祝你愉快!

© . All rights reserved.