Java控制台程序默认是以控制台键盘和显示器作为标准输入/输出设备,在有些情况下,我们可能希望将程序的标准输入/输出进行重定向,如程序有大量的输出数据,如果输出到控制台,但是由于控制台缓存有限,肯能不能容纳所有的输出数据。此时我们就可以将标准输出进行重定向。
例如:我们将输入流定向到磁盘中的一个文件,将文件的内容作为输入数据,然后在程序中进行统计和求平均值,在求平均值的过程中将过程数据通过标准输出(标准输出被重定向到输出文件流)输出到磁盘文件中。最后,如果出现异常信息,则将异常信息通过标准错误输出(标准错误输出重定向到输出日志文件流)输出到指定的日志文件中。代码如下:
package io.stream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; public class OutputSetTest { public static void main(String[] args) { FileInputStream input = null; BufferedReader reader = null; PrintStream sysOut = null; PrintStream sysError = null; try { // 重定向标准输入 input = new FileInputStream(new File("document/dataSysIn.txt")); System.setIn(input); // 重定向标准输出 sysOut = new PrintStream(new File("document/outdata.txt")); System.setOut(sysOut); // 重定向标准错误输出 sysError = new PrintStream(new File("document/logError.txt")); System.setErr(sysError); // 统计变量 int total = 0, avg = 0, count = 0; reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); while ( null != line && !"end".equals(line) ) { int temp = Integer.parseInt(line); count ++; total += temp; line = reader.readLine(); System.out.println("count=" + count + " data=" + temp + " total=" + total); } avg = total / count; System.out.println("输出结果:"); System.out.println("total=" + total + " avg=" + avg); throw new Exception("我故意抛出的异常信息,"+ "为了测试将异常信息写入logError.txt文件。"); } catch(Exception e) { e.printStackTrace(); // 将错误信息输出到日志文件logError.txt文件 System.err.println("出错日期:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) ); System.err.println("错误信息:"); e.printStackTrace(System.err); } finally { if ( null != input ) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } if ( null != reader ) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if ( null != sysOut ) { sysOut.close(); } if ( null != sysError ) { sysError.close(); } } } }
输入数据文件dataSysIn.txt内容如下:
10 20 30 40 50 60 70 80 90 end
输出数据文件outdata.txt内容如下:
count=1 data=10 total=10 count=2 data=20 total=30 count=3 data=30 total=60 count=4 data=40 total=100 count=5 data=50 total=150 count=6 data=60 total=210 count=7 data=70 total=280 count=8 data=80 total=360 count=9 data=90 total=450 输出结果: total=450 avg=50
输出错误日志文件logError.txt内容如下:
java.lang.Exception: 我故意抛出的异常信息,为了测试将异常信息写入logError.txt文件。 at io.stream.OutputSetTest.main(OutputSetTest.java:48) 出错日期:2015-05-27 21:54:53 错误信息: java.lang.Exception: 我故意抛出的异常信息,为了测试将异常信息写入logError.txt文件。 at io.stream.OutputSetTest.main(OutputSetTest.java:48)