File类 【掌握】
什么是File类
File类表示文件和目录(文件夹),在表示的时候不能只告诉程序文件或者目录的名称,
应该要告诉程序文件或者目录的路径

构造方法
    告诉程序你要操作的文件/文件夹在哪里

    File(String pathname)
    File(String parent, String child)
    File(File parent, String child)

    * 构造方法中路径的特点:
        1、可以是存在的路径也可以是不存在的
        2、可以是文件路径也可以是文件夹路径
        3、可以是相对路径也可以是绝对路径

    路径的问题
        绝对路径:以盘符开始的路径(完整的路径)

        相对路径:不以盘符开始的路径(简化/省略路径)
            当前路径相对的是项目根路径,以项目根路径为参照物

            不是所有的绝对路径都可以省略写成相对路径的,只有这个
            绝对路径中包含了项目根目录才可以写成相对路径

            项目根路径:就是你项目存放的路径+项目名

            D:\develop\JetBrains\IdeaProjects2020\javase2\a.txt     -- 绝对路径
            a.txt                                                   -- 相对路径

            D:\develop\JetBrains\IdeaProjects2020\javase2\day11\dir\a.txt    -- 绝对路径
            day11\dir\a.txt                                                  -- 相对路径

            E:\集合.xmind         -- 绝对路径,该路径不能省略为相对路径


成员方法
    对这个关联的文件/文件夹进行创建、删除、获取等操作

    创建
        文件
            boolean createNewFile()

        文件夹
            boolean mkdir()
            boolean mkdirs() :既可以创建单级也可以创建多级文件夹

    删除
        boolean delete()
            既可以删除文件也可以删除文件夹,但是删除文件夹的时候只能删除空文件夹
            删除不走回收站

    判断和获取
        public boolean isDirectory()  测试此抽象路径名表示的File是否为目录
        public boolean isFile()       测试此抽象路径名表示的File是否为文件
            * 以上这个两个方法是互斥的,不是文件就是文件夹,不是文件夹就是文件
              前提:要求文件或者文件夹是存在的,如果不存在,那么这两个方法都会返回false

        boolean exists()       测试此抽象路径名表示的File是否存在

        String getName()       返回由此抽象路径名表示的文件或目录的名称
        long length():可以获取文件的大小(字节数),不能获取到文件夹的大小
        long lastModified() :获取到文件的最后修改时间的毫秒值
        String getAbsolutePath() :获取绝对路径
        File[] listFiles()

IO流-字节流 【掌握】
什么是IO流
输入输出流,用于处理设备(内存/硬盘[文件])之间的数据传输

    输入还是输出是以内存为参照物的,从外界到内存是输入,输入进行的读取操作
    从内存到外界是输出,输出进行的写出的操作


IO流的分类
    按流向分
        输入流和输出流

    按操作的数据类型分
        字节流和字符流
            非纯文本文件只能使用字节流进行操作
            纯文本文件既可以使用字节流也可以使用字符流

IO流的作用
    1、文件复制
    2、文件上传
    3、文件下载

IO流的注意事项
    1、IO流核心的每行代码都有异常,而且是编译时异常
    2、IO流相关的类,都是位于java.io包下
    3、IO流会占用系统资源,操作完之后不要忘记释放资源(关流)


字节流

    字节流的体系结构
        字节输入流
          InputStream(抽象类)
                |-FileInputStream:基本流
                |-FilterInputStream
                    |-BufferedInputStream:缓冲流

        字节输出流
            OutputStream(抽象类)
                |-FileOutputStream:基本流
                |-FilterOutputStream
                    |-BufferedOutputStream:缓冲流

    字节流的基本流
        FileOutputStream
            构造方法
                FileOutputStream(String name)
                FileOutputStream(String name, boolean append)
                FileOutputStream(File file)
                FileOutputStream(File file, boolean append)


            成员方法
                 void write(int b):写出字节数据 int->byte
                 void write(byte[] b)
                    * write("\r\n".getBytes()) 换行

                 void write(byte[] b, int off, int len)

                 void close()



                //1.创建字节输出流的对象
                                //注意点:1、如果文件不存在,会帮我们自动创建出来,但是要求文件路径要存在
                                //      2、如果文件存在,会把文件清空,再写出到文件
                                        3、可以写相对路径,也可以写绝对路径
                                        4、关联的路径永远只能是文件路径,不能是文件夹路径
                FileOutputStream fos = new FileOutputStream("C:\\itheima\\a.txt");

                //2,写数据
                // 传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符.
                fos.write(98);// 98(十进制)->00000000 00000000 00000000 01100010(int、二进制)
                              // ->01100010(byte、二进制) ->写入到文件中,但是文本编辑器是一个编解码
                              // 编解码
                                // 编码:将我们人类能看懂的文字(字符)转为计算机看得懂的(二进制)
                                // 解码:将计算机看得懂的(二进制)转为我们人类能看懂的文字(字符)


                //3,释放资源
                fos.close(); //告诉操作系统,我现在已经不要再用这个文件了


        FileInputStream
            构造方法
                FileInputStream(String name)
                FileInputStream(File file)


            成员方法
                int read():一次读取一个字节,并返回读取到的字节,如果读取到了文件末尾,返回-1
                int read(byte[] b):一次读取多个字节,并返回读取到数组中的有效字节个数,如果读取到了文件末尾,返回-1
                void close()



                //如果文件存在,那么就不会报错.
                //如果文件不存在,那么就直接报错.
                FileInputStream fis = new FileInputStream("bytestream\\a.txt");

                int read = fis.read();
                //一次读取一个字节,返回值就是本次读到的那个字节数据.
                //也就是字符在码表中对应的那个数字.
                //如果我们想要看到的是字符数据,那么一定要强转成char

                System.out.println((char)read);

                //释放资源
                fis.close();