IO流之打印流

查看源码可知,System.out 就是 PrintStram 类的实例

                          System.in 就是 InputStram类的实例

1. System.out

查看 System源码可知,System 是 java.lang 包下的一个类,out是其的静态成员,就是 OutputStream的实例

所以像下图代码那样写是完全可以的

public static void print(String str) {
		// 查看源码可知 out 就是一个类静态成员,是一个 PrintStream 类的实例
		// 也就是一个 输出流,所以此处完全可以用 PrintStram 的实例来接收  System.out
		PrintStream ps = System.out;
		
		ps.print(str);
	}

2.既然我们知道了System.out 就是一个 OutputStram的实例,我们都知道,Os是可以输出到文件的,那么 System.out 是否可以输出到文件呢?答案是肯定的,肯定可以,代码如下图所示:

public static void printToFile(String str) throws FileNotFoundException {
		// 查看源码可知,System有一个 setOut 方法,传入 OutputStram 参数
		System.setOut( 
				new PrintStream( 
						new BufferedOutputStream( 
								new FileOutputStream("D:/print.txt") 
						) 
					) 
				);
		
		System.out.print(str);
		System.out.flush();
	}

运行效果如下:

注意,此处,system.out 之后文件里面可能没内容,原因是没有 flush 强制刷新的原因,所以养成输出流输出完毕后强制刷新是个好习惯啊。这里其实可以使用 PrintStram 的另一个构造方法,加上一个 true ,自动强制刷新,就ok了

就像这样:

public static void printToFile(String str) throws FileNotFoundException {
		// 查看源码可知,System有一个 setOut 方法,传入 OutputStram 参数
		System.setOut( 
				new PrintStream( 
						new BufferedOutputStream( 
								new FileOutputStream("D:/print.txt",true)
						) 
					,true)
				 );
		
		System.out.print(str);
	}

3.在输出到文件之后,输出了一会儿之后我又想输出到控制台呢?可不可以呢,肯定是可以的

查看System 源码的 initializeSystemClass() 源码,看到里面有这样一段代码

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);

所以要想回到控制台肯定还是 setOut 操作了,只不过是 new FileOutputStream()里面放的是 FileDescription.out了

代码如下

System.setOut( new PrintStream( 
				new BufferedOutputStream( 
						new FileOutputStream( 
								FileDescriptor.out
								)
						) , true)
				);
		System.out.println(str);

4.既然System.out 可以这样玩,那么 Sytem,in 可不可以呢,System.in 就是 System的一个静态成员,InputStream的实例,所以答案肯定是能的。

System.in 的从文件输入

代码如下

public static void printFormFile(String path) throws IOException {
		InputStream is = System.in;
		is = new BufferedInputStream(
					new FileInputStream(
								new File(path)
							)
				);
		
		Scanner scanner = new Scanner(is);
		System.out.println(scanner.nextLine());
		
		scanner.close();
		is.close();
		
	}

5.System.in  的键盘输出

代码如下:

public static void printForKeybord() throws Exception {
		InputStream in = System.in;
		
		// 此处使用 BufferedReader 因为有新加的方法 readLine() 方便操作
		BufferedReader br = new BufferedReader(
					new InputStreamReader(in)
				);
		
		System.out.println("请输入!");
		String readLine = br.readLine();
		System.out.println( readLine );
	}

效果如图:

 

!!!是不是似曾相识??? 是不是想起来一个叫 Scanner 的类,其实也就那么回事,是吧,也就是个跟 InputStram ,Reader差不多的东西,

所以,我们上面的 那里从文件读取数据输出到控制台使用 Scanner 的地方也可以这样修改:

public static void printFormFile(String path) throws IOException {
		InputStream is = System.in;
		is = new BufferedInputStream(
					new FileInputStream(
								new File(path)
							)
				);
		
		//Scanner scanner = new Scanner(is);
		BufferedReader br = new BufferedReader(
					new InputStreamReader(is)
				);
		String len = null;
		while( null != (len = br.readLine()) ) {
			System.out.println( len );
		}
		
		
		is.close();
		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值