import java.io.*;
/*
IO流的操作规律。
三个明确:
1,明确源(读)和目的(写)。
		其实就是在明确输入流还是输出流。
		源:输入流 InputStream  Reader
		目的:输出流 OutputStream  Writer
2,明确操作的数据内容。
		其实就是在明确字符流还是字节流。
		如果数据都是纯文本数据使用字符流。
		如果数据是非文本数据使用字节流。
前两步已经明确了使用哪一个体系。
3,明确具体的设备。
	明确使用的具体对象。
	源设备:内存,键盘(System.in),硬盘(文本)(File)。
	目的设备:内存,控制台(System.out),硬盘(文件)(File).
扩展部分:需要进行高效操作吗?
	是:加入缓冲区技术(Buffered)。
--------------------------------------------------
需求1:
读取键盘,并键盘录入的数据变成大写打印在控制台上。
需求2:
读取键盘录入数据,将数据变成大写,保存到一个文件中。
分析:
源:键盘,InputStream。Reader
是纯文本数据:Reader.
设备:System.in.
已经明确了使用读取字符流体系,可是设备是键盘System.in是读取字节流对象。
这时就需要将字节流转成字符流。用到了InputStreamReader.
需要高效吗?需要。Buffered
BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));
Note: 键盘录入,就写这句代码!
目的:硬盘,OutputStream Writer
纯文本?yes Writer
设备:硬盘文件 FileWriter。
缓冲,yes
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt")));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"GBK"));
这三句都是等效的。使用都是默认的编码表GBK.
另加一个需求?
想要将录入的数据按照UTF-8另一个编码表的形式进行数据的存储。
那么目的就要变化了,因为FileWriter,虽然可以作为文件目的对象,但是该对象中的编码表是默认的GBK。
当想要指定编码表时,必须要使用转换流。
BufferedWriter bufw = 
	BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8"));
##############################################
#记住:凡是涉及到编码转换的操作,            #
#一定要想到转换流,如果只用默认码表,		 #
#可是使用转换流的子类FileWriter或FileReader. #
##############################################
-----------------------------------------------------
需求3:
读取一个文本文件,将文本文件的数据展现在控制台上。
分析:
源:硬盘文件。InputStream Reader。
纯文本?yes  Reader。
设备:硬盘 FileReader.
缓冲?yes  BufferedReader 
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
目的:OutputStream  Writer
纯文本?yes  Writer.
设备:控制台 System.out.
发现控制台的对象是System.out.是字节输出流。
因为是纯文本数据,使用Writer所以可以将字符流转成成字节串流。
使用了转换流 OutputStreamWriter
需要高效吗?需要。
BufferedWriter bufw = 
	new BufferedWriter(new OutputStreamWriter(System.out));
---------------------------------------------------
需求4:
读取一个文本文件,将数据变成大写,存到一个文件中。
分析:
源?目的?
源:一个硬盘文件。就明确了要使用InputStream  Reader
是纯文本的吗?是,就进一步明确了使用Reader.
什么设备:硬盘文件。在进一步明确了使用Reader体系中FileReader
FileReader fr = new FileReader("a.txt");
需要提高效率吗?需要!
BufferedReader bufr = new BufferedReader(fr);
目的:一个硬盘文件。使用体系 OutputStream Writer
是纯文本吗?是,使用Writer。
目的设备:硬盘文件.使用FileWriter.
FileWriter fw = new FileWriter("b.txt");
需要高效吗?需要!
BufferedWriter bufw = new BufferedWriter(fw);
*/
class  TransStreamDemo2
{
	public static void main(String[] args)throws IOException 
	{
		/*
		InputStream in = System.in;
		//需要将字节流转成字符流。
		InputStreamReader isr = new InputStreamReader(in);
		//使用缓冲区的readLine
		BufferedReader bufr = new BufferedReader(isr);
		OutputStream out = System.out;
		
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter bufw = new BufferedWriter(osw);
		*/
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(new FileInputStream("LineNumberReaderDemo.java")));
		BufferedWriter bufw = 
			new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copyLine.txt")));
		String line  = null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufw.close();
		bufr.close();
	}
}
/*
c:\abc
c:\abc\haah
c:\abc\0.mp3    "c:\abc\0.mp3"--replace("c:\abc","d:\qq\abc")->"d:\qq\abc\0.mp3"
new FileInputStream("c:\abc\0.mp3");
new FileOutputStream("d:\qq\abc\0.mp3");
d:\qq\
d:\qq\abc\haah
d:\qq\abc\0.mp3
d:\qq\
d:\qq\abc
d:\qq\abc\0.mp3
*/