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)