IO流的操作规律。

字符流:
FileReader
FileWriter
BufferedReader
BufferedWriter
InputStreamReader
OutputStreamWriter

字节流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOUtputStream

//疑问:开始时,用哪个流对象解决问题呢?

明确一:明确源和目的。
 源:就需要读,就需要使用输入体系。InputStream   Reader
 目的:就需要写,就需要使用输出体系。OutputStream Writer
 
明确二:处理的数据是否是纯文本数据。
 是:就使用字符流。
  源:Reader
  目的:Writer
 否:就是用字节流。 
  源:InputStream
  目的:OutputStream
  
两个明确都确定后,可以确定需要使用哪个体系。

明确三:具体是哪个设备,明确设备的目的是为了确定具体的对象。
 源设备:
  键盘,System.in
  硬盘,操作文件的对象。File开头的流对象。
  内存,数组。ByteArrayInputStream CharArrayReader  StringReader
  网络,Socket
 目的设备:
  硬盘,操作文件的对象。File开头的流对象。
  屏幕(控制台)System.out
  内存,数组 ByteArrayOutputStream  CharArrayWriter  StringWriter
  网络,Socket
  
 需求:将字符串数据写到硬盘上。
 目的:OutputStream Writer
 纯文本?是,Writer
 设备?硬盘,FileWriter
 FileWriter fw = new FileWriter("a.txt");
 
明确四:是否需要额外功能?
 1,需要高效吗?BufferedInputStream BuffedOutputStream
 2,需要字节和字符之间的桥梁吗?转换流。InputStreamReader OutputStreamWriter
 3,需要保证数据输出时表现形式吗?PrintWriter  PrintStream
 4,需要对对象进行序列化和反序列化吗?ObjectInputStream ObjectOutputStream
 5,需要操作基本数据类型值吗?DataInputStream DataOutputStream
 6,需要进行数据的合并吗?SequenceInputStream
 
 

---------------------------------------------------
需求1:对文本文件进行复制。
 明确1:源和目的。
  源:InputStream Reader
  目的:OutputStream Writer
 明确2:是否是纯文本。
  是!
  源:Reader
  目的:Writer
 明确3:具体的设备。
  源:硬盘。
  目的:硬盘。
  
 FileReader fr = new FileReader("a.txt");
 FileWriter fw = new FileWriter("b.txt");
 明确4:额外功能。
  需要,高效。
 BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
 BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
 
 当然如果仅为复制文件,在该例中可以使用字节流完成。
 
 
 
需求2:读取键盘录入数据并保存到文件中。
 明确1:源,目的。
 源:InputStream  Reader
 目的:OutputStream  Writer
 
 明确2:是纯文本。
 是!
 源:Reader
 目的:Writer
 
 明确3:具体设备。
 源设备:键盘。
 目的设备:硬盘。
 
 InputStream in = System.in; 
 //byte[] buf = new byte[1024];
 //int len = in.read(buf); 
 //str = new String(buf); 
 FileWriter fw = new FileWriter("a.txt");
 fw.write(str);
 
 虽然可以用该代码完成,但是麻烦。
 解决问题,源是字节流,目的是字符流。而最终确定的都是字符流体系。
 源使用的Reader就可以了。那么怎么能将源字节流转成字符流呢?
 
 明确4:额外功能?
 需要,转换。将字节流转成字符流。
 InputStreamReader isr = new InputStreamReader(System.in);
 FileWriter fw = new FileWriter("a.txt");
 这时就需要定义一个字符数据作为缓冲。
 还需要其他功能吗?需要,高效。
 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//以后获取键盘录入,就使用该句。
 BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
 
 String line = null;
 while((line=bufr.readLine())!=null)
 {
  if("over".equals(line))
   break;
  bufw.write(line);
  bufw.newLine();
  bufw.flush();
 }


需求3:读取硬盘上的文本文件将数据打印到屏幕上。
 明确1:源,目的。
 源:InputStream Reader
 目的:OutputStream Writer
 明确2:纯文本?
 是!
 源:Reader
 目的:Writer。
 
 明确3:具体设备:
 源设备:硬盘。
 目的设备:屏幕。
 
 FileReader fr = new FileReader("a.txt");
 PrintStream out = System.out;

明确4:额外功能。
 高效!
 
 BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
 也希望目的也高效。想使用字符流的缓冲区对其高效。而System.out是字节流。
 读到的字符,最终要转成成字节流,到System.out屏幕上。
 需要用字符转成字节的桥梁。
 BufferedWrier bufw = new BufferedWriter(new OutputStreamWriter(Sysetm.out));




需求4:读取一个文本文件,将数据转成UTF-8保存到另一个文件中。
 
 明确1:源,目的。
 源:InputStream Reader
 目的:OutputStream Writer
 明确2:纯文本?
 是!
 源:Reader
 目的:Writer。
 
 明确3:具体设备。
 源:硬盘。
 目的:硬盘。
 
 FileReader fr = new FileReader("a.txt");
 FileWriter fw = new FileWriter("b.txt");
 
 不行!
 源可以使用FileReader,因为可以使用默认本地编码。
 而目的明确指定了编码表。就不可以使用FileWriter。
 
 在字符转成字节的过程,需要加入编码。
 明确4:需要额外功能?
 需要,转换。
 FileReader fr = new FileReader("a.txt");
 //要转成可以操作文件的字节流。
 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
 
 还需要额外功能吗?
 需要,高效。
 BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
 BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8"));


-------------------------------------------------------
练习:读取键盘录入,将读取的数据进行临时存储,如果存储的数据是over。则键盘录入结束。
 如果不是,则将数据转成大写显示在屏幕上。
 如果不用readLine,你怎么做呢?
 
 


预习:自己演示一下File类中的list 

-----------------------------------------------------------

IO流的体系:

字节流
OutputStream
 |--FileOutputStream:
 |--FilterOutputStream
  |--BufferedOutputStream:
  |--DataOutputStream:
  |--PrintStream:
 |--ObjectOutputStream:
 |--PipedOutputStream:
 |--ByteArrayOutputStream:
 
 
 

InputStream
 |--FileInputStream:
 |--FilterInputSteam
  |--BufferedInputStream:
  |--DataInputStream:
 |--ObjectInputStream:
 |--PipedInputStream:
 |--ByteArrayInputStream:
 |--SequenceInputStream:
   


字符流

Reader
 |--BufferedReader:
  |--LineNumberReader:
 |--InputStreamReader:
  |--FileReader:
 |--CharArrayReader:
 |--StringReader:
 

Writer
 |--BufferedWriter:
 |--OutputStreamWriter:
  |--FileWriter:
 |--PrintWriter:
 |--CharArrayWriter:
 |--StringWriter:

RandomAccessFile:

File:

-----------------------------------------------

面向对象:
 封装:
  隐藏实现细节,多外暴露公共的接口。
 继承:
  提高代码的复用性,类与类之间有了关系。
 多态:★★★★★
  提高了程序的扩展性。向上转型,向下转型。USB接口的例子。

集合框架:
 |--ArrayList:★★★★★
 |--LinkedList:
 |--HashSet:★★★★★
  |--LinkedHashSet:★★★
 |--TreeSet:
 |--HashMap:★★★★★★
  |--LinkedHashMap:★★★
 |--TreeMap:
 |--Hashtable
  |--Properties:★★★★★★
 
 String:
 StringBuilder:
 Integer:
 


IO流:
 File:★★★★★
 FileInputStream
 FileOutputStream
 FileReader
 FileWriter 
 BufferedReader
 BUfferedWriter
 InputStreamReader★★★★★
 OutputStreamWriter★★★★★
 PrintWriter:★★★★★
 IO流的操作规律。★★★★★★★
 
 需求5:将一个对象写入到文件中,并读取该对象。
 
 
将这些知识点都总结完毕后,将对应的练习做完,通过练习来打到复习的效果。

三个阶段测试秒杀一遍。