package com.io.g_sequence;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import org.junit.Test;

/*
 * 打印流:PrintStrean,可以打印任意类型的数据,而且在打印数据之前都会将数据先转换成字符串再进行打印;
 * 
 * 	打印流作用:
 * 		1、输出任何类型的数据到文件上;
 * 		2、收集异常的日志信息;
 */

class Person{
	String name;
	int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "[name=" + name + ", age=" + age + "]";
	}
}

public class Demo5 {

	// 使用输入字节流写数据
	@Test
	public void test1() throws IOException{
		// 找到目标文件
		File file = new File("D:\\a.txt");
		// 建立数据输出通道
		FileOutputStream out = new FileOutputStream(file);
		
		// 输出数据:
		// 问题:为什么写入的数据是97,而打开记事本看到的却是 a ?
		// 因为数据97是以字节流的形式写入的,而记事本本身就具有解码的功能,所以打开记事本的时候会自动将97解码成a;
		out.write(97);
		
		// 由于记事本显示的数据都是以字符串的形式,所以如果想向文件中写入97,可以使用下面的方法:
		// 还可以直接使用 PrintStream 输出任意类型的数据;
		out.write("97".getBytes());
		
		// 关闭资源
		out.close();
	}
	
	// 使用打印流输出数据
	@Test
	public void test2() throws IOException{
		// 找到目标文件
		File file = new File("D:\\a.txt");
		// 创建一个打印流
		PrintStream print = new PrintStream(file);
		
		// 输出数据:可以打印任意类型的数据
		print.println(97);
		print.println('a');
		print.println("aa");
		print.println(3.14);
		print.println(true);
		
		char[] buf = {'a', 'b', 'c', 'd'};
		print.println(buf);
		
		Person person = new Person("张三", 22);
		print.println(person); // 打印对象就是调用对象的 toString() 方法;
		
		// 关闭资源
		print.close();
	}
	
	@Test
	public void test3() throws IOException{
		// 找到目标文件
		File file = new File("D:\\a.txt");
		
		// 建立打印流
		PrintStream print = new PrintStream(file);
		
		// 该输出语句也是使用了PrintStream打印流;从源码可以看出,out就是在System类中维护的一个PrintStream对象;
		// 默认情况下,标准的输出流就是向控制台输出数据的;但是也可以重置标准的输出流对象,指定输出的位置;
		System.out.println("Hello World");
		
		System.setOut(print); 	// 重置标准输出流,将数据输出到文件中;
		System.out.println("我在文件中。");
	}
	
	// 收集异常的日志信息
	@Test
	public void test4() throws IOException{
		// 找到目标文件
		File file = new File("D:\\2017-10-12.log");
		// 建立数据输出通道;(true:追加信息)
		FileOutputStream out = new FileOutputStream(file, true);
		
		// 建立打印流:此方法输出的信息是覆盖的
//		PrintStream print = new PrintStream(file);
		
		// 建立打印流:此方法输出的信息是追加的
		PrintStream print = new PrintStream(out);
		
		try{
			int i = 1/0;
			System.out.println(i);
		}catch(Exception e){
//			e.printStackTrace(); 		// 该方法是将异常信息输出到控制台上
			e.printStackTrace(print);	// 通过打印流将异常信息输出到文件上
			print.println();
		}

		try{
			int[] arr = null;
			System.out.println(arr.length);
		}catch(Exception e){
//			e.printStackTrace(); 		// 该方法是将异常信息输出到控制台上
			e.printStackTrace(print);	// 通过打印流将异常信息输出到文件上
		}
	}
	
}