• javaIO流(一)


    1.IO流分类:按方向分为输入流和输出流,按流的操作分为字节流和字符流。

    2.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。简单说:字节流+编码表(本地默认编码一般为GBK) 

    3.流的细节:close() 方法已经调用flush(),使用缓冲流写数据时会用到 flush(),finally 关闭流时,一定要先判断是否为null。

    4.字符流: Writer --> FileReader --> BufferedReader --> LineNumberReader
            Reader --> FileWriter --> BufferedWriter

    5.字节流:InputStream  --> FileInputStream  --> BufferedInputStream
            OutputStream --> FileOutputStream --> BufferedOutputStream

    6.转换流:将字节流和字符流连通
          InputStream  -->  InputStreamReader  --> BufferedReader    字节到字符的桥梁。解码。
            OutputStream -->  OutputStreamWriter --> BufferedWriter    字符到字节的桥梁。编码。
       什么时候使用转换流呢?
        1,源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。提高对文本操作的便捷。
        2,一旦操作文本涉及到具体的指定编码表时,必须使用转换流。

    7.缓冲流:使用了装饰模式。
       BufferedReader 
       BufferedWriter  
       BufferedInputStream  
       BufferedOutputStream

    8.装饰设计模式:对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。装饰和继承都能实现一样的特点:进行功能的扩展增强。有什么区别呢?首先有一个继承体系。但是这样做好像并不理想。如果这个体系进行功能扩展,有多了流对象。那么这个流要提高效率,是不是也要产生子类呢?是。这时就会发现只为提高功能,进行的继承,导致继承体系越来越臃肿。不够灵活。重新思考这个问题?既然加入的都是同一种技术--缓冲。前一种是让缓冲和具体的对象相结合。可不可以将缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲关联。装饰比继承灵活。特点:装饰类和被装饰类都必须所属同一个接口或者父类。

    9.流的操作规律:
       1,明确源和目的 
          源:InputStream  Reader
          目的:OutputStream  Writer

       2,明确数据是否是纯文本数据。
          源:是纯文本:Reader
                 否:InputStream
          目的:是纯文本:Writer
                   否:OutputStream
         到这里,就可以明确需求中具体要使用哪个体系。

       3,明确具体的设备。
          源设备:
           硬盘:File
           键盘:System.in
           内存:数组
           网络:Socket流

        目的设备:
           硬盘:File
           控制台:System.out
           内存:数组
           网络:Socket流

      4,是否需要其他额外功能。
          1,是否需要高效(缓冲区);
           是,就加上buffer.
          2,转换。
    -----------------------------demo---------------------------------------------------------------------------------------------------------------

    需求1:复制一个文本文件。
     1,明确源和目的。
      源:InputStream Reader
      目的:OutputStream  Writer
     2,是否是纯文本?
      是!
      源:Reader
      目的:Writer
      
     3,明确具体设备。
      源:
       硬盘:File
      目的:
       硬盘:File
     
      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,明确设备
      源:
       键盘。System.in
      目的:
       硬盘。File
       
      InputStream in = System.in;
      FileWriter fw = new FileWriter("b.txt");
      这样做可以完成,但是麻烦。将读取的字节数据转成字符串。再由字符流操作。
     4,需要额外功能吗?
      需要。转换。 将字节流转成字符流。因为名确的源是Reader,这样操作文本数据做便捷。
       所以要将已有的字节流转成字符流。使用字节-->字符 。InputStreamReader
      InputStreamReader isr = new InputStreamReader(System.in);
      FileWriter fw = new FileWriter("b.txt");
      
      还需要功能吗?
      需要:想高效。
      BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
      BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
      
       
      
    ===================================================
     
    需求3:将一个文本文件数据显示在控制台上。
     1,明确源和目的。
      源:InputStream Reader
      目的:OutputStream  Writer
     2,是否是纯文本呢?
      是,
      源:Reader
      目的:Writer
     3,明确具体设备
      源:
       硬盘:File
      目的:
       控制台:System.out
       
      FileReader fr = new FileReader("a.txt");
      OutputStream out = System.out;//PrintStream
     4,需要额外功能吗?
      需要,转换。
      FileReader fr= new FileReader("a.txt");
      OutputStreamWriter osw = new OutputStreamWriter(System.out);
      需要,高效。
      BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
      BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
      
    ================================================================

    需求4:读取键盘录入数据,显示在控制台上。
     1,明确源和目的。
      源:InputStream Reader
      目的:OutputStream  Writer
     2,是否是纯文本呢?
      是,
      源:Reader
      目的:Writer
     3,明确设备。
      源:
       键盘:System.in
      目的:
       控制台:System.out
      
      InputStream in = System.in;
      OutputStream out = System.out;
      
     4,明确额外功能?
      需要转换,因为都是字节流,但是操作的却是文本数据。
      所以使用字符流操作起来更为便捷。
      InputStreamReader isr = new InputStreamReader(System.in);
      OutputStreamWriter osw = new OutputStreamWriter(System.out);
      
      为了将其高效。
      BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
      BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
      
      
    ============================================================

    5,将一个中文字符串数据按照指定的编码表写入到一个文本文件中.
     
     1,目的。OutputStream,Writer
     2,是纯文本,Writer。
     3,设备:硬盘File
     FileWriter fw = new FileWriter("a.txt");
     fw.write("你好");
     
     注意:既然需求中已经明确了指定编码表的动作。
     那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表。
     只能使用其父类。OutputStreamWriter.
     OutputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该对象应该是FileOutputStream
     
     OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
     
     需要高效吗?
     BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));


     

  • 相关阅读:
    C#中char[]与string之间的转换
    Java文件操作之文件追加 Chars
    冒泡排序法的改进 Chars
    选择排序 Chars
    编译原理 Chars
    Apk反编译 Chars
    VC中常用的方法 Chars
    Node.Js入门级《培训》
    新概念系列之《Part2 Lesson 24 It could be worse》
    《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(三)
  • 原文地址:https://www.cnblogs.com/lyp-java/p/4529795.html
Copyright © 2020-2023  润新知