跟我学IO(重定向标准输出和标准错误输出)

Java控制台程序默认是以控制台键盘和显示器作为标准输入/输出设备,在有些情况下,我们可能希望将程序的标准输入/输出进行重定向,如程序有大量的输出数据,如果输出到控制台,但是由于控制台缓存有限,肯能不能容纳所有的输出数据。此时我们就可以将标准输出进行重定向。

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)

人生就像赛跑,不在乎你是否第一个到达终点,而在乎你有没有跑完全程。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
目录
热门标签
热门文章
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号