IO 流的操作基本规律

  • 想要知道开发时,使用哪个流对象, 只要通过四个明确即可.
  1. 明确源和目的(数据汇)

    • 源: InputStream 或 Reader
    • 目的: OutPutStream 或 Writer
  2. 明确数据是否是纯文本数据

    • 源:
      • 是纯文本: Reader
      • 不是纯文本: InputStream
    • 目的:
      • 是纯文本: Writer
      • 不是纯文本: OutputStream
    • 到这里, 就可以明确需求中具体要使用哪个体系.
  3. 明确具体的设备, 即要明确使用哪一个对象

    • 源设备:
      • 硬盘: File
      • 键盘: System.in
      • 内存: 数组
      • 网络: Socket 流
    • 目的设备:
      • 硬盘: File
      • 键盘: System.out
      • 内存: 数组
      • 网络: Socket 流
  4. 是否需要额外的功能

    • 需要高效(缓冲区), 就加上 buffer
    • 需要转换, 就将字节流转换为字符流
// 示例: 将一个中文字符串数据按照指定的编码表写入到一个文本文件中.

    /* 
     * 思路:
     *    1. 目的: OutputStream, Writer
     *    2. 是纯文本数据: Writer
     *    3. 设备: 硬盘, File
     *        FileWriter fw = new FileWriter("a.txt");
     *        fw.write("你好");
     *        fw.close();
     * 注意:
     *     既然需求中已经明确了指定编码表的动作, 那就不可以使用 FileWriter, 因为 FileWriter 内部
     *     使用的是默认的本地编码表.
     *     因此,只能使用其父类, OutputStreamWriter, 转换流
     *     OutputStreamWriter 的构造方法中必须带有一个字节输出流对象, 既然是操作文件,
     *     那么该对象应该是 FileOutputStream.
     *     
     *  OutputStreamWriter osw = 
     *         new OutputStreamWriter(new FileOutputStream("a.txt"), charsetName(编码表));
     *     osw.write("你好");
     *     osw.close();
     */

  • 什么时候使用转换流呢?
    1. 源或者目的对应的设备是字节流, 但是操作的却是文本数据, 可以使用转换流作为桥梁
      提高对文本操作的便捷
    2. 一旦操作文本涉及到具体指定的编码表时, 必须使用转换流.

参考资料

原文地址:https://www.cnblogs.com/linkworld/p/7514008.html