您的位置:首页 > 职场人生

黑马程序员—学习java基础8日志

2014-09-10 13:34 330 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

   

          IO流常用基类

   字符流和字节流。

   字节流两个基本类:

   InputStream   OutputStream

   字符流两个基本类:

   Reader   Writer

    注:由这四个类派生出来的子类名字都是以其父类名作为子类名的后缀。

         如:InputString的子类FileInputString

             Reader的子类FileReader

一,1,字符流的特点。

   数据的最常见体现形式是:文件

        

2,IO流异常处理信息:

       

3,对已有文件的续写:

        

4,读出流。Reader:

          

    

    

             流操作文件的原理图:

                     

   5,字符流的缓冲区:

      缓冲区的出现是为了提高流的操作效率而出现的。

      对应类:BufferedWriter     BufferedReader

      缓冲区要结合流才可以使用。

      在流的基础上对流的功能进行了增强。

     

         1, 在创建缓冲区之前,必须要要有流对象。

            该缓冲区中提供了一个跨平台的换行符。newLine();

             

        2,字符读取流缓冲区:
  该缓冲区提供了一个一次读一行的方法 readLine
  当返回null时,表示读到文件末尾。
  readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

                  

                  readeLine原理图:

                             

     6,带行号的缓冲区对象 setLineNumber()   getLineNumber()

                 

     7,装饰和继承:

         MyReader//专门用于读取数据的类。

             |--MyTextReader

                |--MyBufferTextReader

             |--MyMeriaReader

                |--MyBufferMeriaReader

             |--MyDataReader

                |--MyBufferDataReader
class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaReader media)
{}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。

class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r)
{}

}
优化体系变为:
MyReader//专门用于读取数据的类。

    |--MyTextReader 

    |--MyMeriaReader

    |--MyDataReader

    |--MyBufferReader

装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能额已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是属于一个体系中的。

二,字节流:InputStream(读取)  OutputStream(写入)

    1,FileInputStream

      FileOutpurStream

       缓冲区:
BufferedInputStream
BufferedOutputStream

        通过键盘录入一行数据并打印大写,发现就是读一行数据的原理。也就是reanLine方法
readLine方法是字符流BufferedReader类中的方法。
而键盘录入的read方法是字节流InputStream的方法。

        

        InputStreamReader 是字节流通向字符流的桥梁。

        OutputStreamWriter 是字符流通向字节流的桥梁。

        System.out:对应的是标准输出设备:控制台。
System.in:对应的是标准输入设备:键盘。

   2,流操作的基本规律:
通过三个明确来完成:
1,明确源和目的。

   源:输入流  InputStream Reader

    目的:输出流  OutputSteam  Writer
2,操作的数据是否是纯文件。

   是:字符流

   不是:字节流
3,当体系明确后,在明确要使用哪个具体的对象。通过设备来区分:

   源设备:内存,硬盘,键盘。

    目的设备:内存,硬盘,控制台。

判断示例:   将一个文本文件中的数据存储到另一个文件中。就是复制文件。

  源:因为是源,所以使用读取流。InputStream  Reader
是不是操作文件?
是:这时就可以选择Reader   这样体系就明确了

接下来明确要使用该体系中的那个对象。
明确设备:硬盘,上的一个文件。
Reader体系中可以操作文件的对象是FileReader
FileReader fr=new FileReader("a.txt");
是否需要提高效率?是:加入Reader体系中缓冲区 BufferedReader
BufferedReader bufr=new BufferedReader(fr);

目的:OutputStream   Writer

    是否是纯文本。
是:Writer
设备:硬盘,上的一个文件
Writer体系中可以操作文件的对象FileWriter
FileWriter fw=new FileWriter("b.txt");

    是否需要提高效率?是:加入Writer体系中缓冲区 BufferedWriter
BufferedWriter bufw=new BufferedWriter(fw);

         字节流操作示例:

                

  3,/*,需求:将键盘录入的数据保存到一个文件中。

     这个需求中有源和目的都存在。那么分别分析
源:InputSteram Reader
是不是纯文本?是:Reader

设备:键盘。对应的对象时System.in
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转换成Reader
用了Reader体系中转换流,InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率吗?需要:BufferedReader
BufferedReader bufr=new BufferedReader(isr);

  目的:OutpurStream  Writer

  是否是纯文本?是:Writer

  设备:硬盘。一个文件。使用FileWriter

  FileWriter fw=new FileWriter("c.txt");

  需要提高效率吗?需要:BufferedWriter

  BufferedWriter bufw=new BufferedWriter(fw);*/

        代码体现:

            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: