IO流
    I  input 输入
    O  Output 输出
    流：Stream是一种抽象的概念，是对数据传输的总称，
    也就是说数据在设备直接进行传输就称为流。流的本质是数据传输。
    IO流就是用来处理设备之间的传输问题的，比较常见的应用：文件上传、文件下载、文件复制

基础流：
    IO流的分类：
    按照流向分类
        输入流：读数据
        输出流：写数据
    按照流的数据类型分类：
        字节流
            字节输入流
            字节输出流
        字符流
            字符输入流
            字符输出流

IO流的使用场景
    如果操作的是纯文本文件，优先使用字符流
    如果操作的是图片、视频、音频、有格式文本等等二进制文件，那么一定要使用字节流。
    如果操作的文件类型不确定，优先使用字节流。

字节流：
    字节流基类(父类):
        InputStream     这个抽象类是所有字节输入流类的父类
        OutputStream    这个抽象类是所有字节输出流类的父类
    文件字节输入流：FileInputStream 是InputStream的子类，专门用来做文件的输入操作
    它操作文件数据的方法：read()

    文件字节输出流：FileOutputStream 是OutputStream的子类，专门用来做文件的输出操作
    它操作文件数据的方法：write()
    write(int b)    写入一个字节
    write(byte[] bytes) 写入一个字节数组
    write(byte[] bytes,int off,int len) 写入一个字节数组，从off开始写入len长度个字节。

    //Windows系统换行 \r\n





案例：
    结合23种设计模式中的模板模式，实现如下操作：
    调用该方法并传入参数后，会在D盘中创建《title》.txt文件，并在文件中自动写出文章。
    public static boolean AutoWriting(String title){

        return true;
    }

-[模板设计模式]
把抽象类整体看成一种模板，模板种不能决定的东西都定义为抽象方法。
让使用模板的类(继承抽象类的类)，去重写抽象方法，自己实现需求。
模板设计模式的优势：
    模板已经定义了通用的结构，使用的人只需要关心自己要实现的功能就可以了。

abstract class 作文模板类{
    public void write(){
        System.out.println("《我的爸爸》");
        body();
        System.out.println("啊~这就是我的爸爸！");
    }
    public abstract void body();
}

处理流：
    基于基础流进行的强化，比如缓冲流。因为是对基础流的强化，所以创建处理流的时候，构造方法的参数是基础流对象
    字节缓冲流
        |-字节缓存输入流   BufferedInputStream
            new BufferedInputStream(new FileInputStream());
        |-字节缓存输出流   BufferedOutPutStream
    字符缓冲流


字符流：
    字符流=字节流+字符编码表
字符编码表--字符集
    字符集是一个系统支持的所有字符的集合，包括各个国家的文字、标点符号、图形符号、数字等等
    计算机想要准确的存储和识别各种字符集符号，就需要进行字符编码，一套字符集必须要有一套编码表。
    常见的字符集：ASCII字符集，GB-XXXX字符集 Unicode字符集

    把字符串转换为字节的方法：
        byte[] getBytes();  使用平台默认的字符集把String类型字符串转换为一系列字节。
        byte[] getBytes(String charsetName);    使用指定的字符集把String类型字符串转换为一系列字节。
        new String(byte[] bytes);  使用平台默认的字符集把一系列字节转换为String类型字符串
        new String(byte[] bytes,charsetName);使用指定的字符集把一系列字节转换为String类型字符串

字符流：
    输入字符流-抽象类 Reader
        |-文件输入字符流 FileReader
            |-构造方法：
                |- new FileReader(File file)
                |- new FileReader(String fileName)
            |-成员方法：
                |- int read() 一次读取一个字符数据
                |- int read(char[] cbuf) 一次读取一个字符数组数据

    输出字符流-抽象类 Writer
        |-文件输出字符流   FileWriter
            |-构造方法：
                |-  new FileWriter(File file)
                |-  new FileWriter(File file,boolean append)
                |-  new FileWriter(String pathName)
                |-  new FileWriter(String pathName,boolean append)
            |-普通方法：
                |- void write(int c)    写一个字符
                |- void write(char[] cbuf)  写一个字符数组
                |- void write(String str)   写一个字符串
                |- void write(String str,int off,int len)   写一个字符串的一部分
                |- flush() 刷新流，刷新后还可以继续写数据。
                |- close() 关闭流

案例需求： 用户注册
    - 编写方法代码，实现用户的用户名和密码保存到本地实现永久化存储
    public static boolean registerUser(String username,String password){
        return false;
    }
- 实现步骤
    - 获取用户输入的用户名和密码
    - 将用户输入的用户名和密码写入到本地文件中
    - 关流,释放资源

处理流：
    基于基础流进行的强化，比如缓冲流。因为是对基础流的强化，所以创建处理流的时候，构造方法的参数是基础流对象
    字符缓冲流
        |- 字符缓冲输入流
            BufferedReader
                |-特有方法：String readLine() 读取一行文字，结果包含行的内容的字符串，不包含任何终止字符，如果已经到达流的结尾，则为null。
        |- 字符缓冲输出流
            BufferedWriter
                |-特有方法：void newLine() 写一行行分隔符，行分隔符字符串有系统属性定义。
