16.文件及IO流的操作

  1. 什么是文件
    1. 范围很广,在生活可指(公文,书信:文章,政策,资料….)
    2. 在程序中指数据的载体(word文档,excel文档.exe文件…)
      文件名由:文件名称.后缀名称表示
      文件内容:本质数据全部是0与1组成的,根据文件的类型不同计算机解释成相应的内容
      如果是文本文件:计算机根据字符编码集映射成汉字展示文件内容
      如果是图片文件:计算机根据像素映射映射成一个个色点,然后整体就是图片效果展示
      说明
      文件名不能用:/:*?<>|组成(因此这些字符在操作系统中都有特殊的用途(搜索符号,表示目录,表示特殊的含义)

            比如\是用来表示某个目录下:如C:\Windows\System32但是如果你有个目录或者文件中包含\就含义不明确了
            准确的说是中文全角状态下是可以用的,因此全角下其ASCII已经完全不一样了
            允许文件或者文件夹名称不得超过255个字符
            开头的空白字符会被截取掉
        文件名与文件类型用.隔开
        文件类型
            查看文件的后缀名,一定要显示文件的后缀,不要被文件名误导
      
            决定了打开文件的方式(计算机如何正确解释文件中内容的含义)
            计算机会根据文件类型选择关联的应用软件打开文件
            如果使用软件不具备打开某文件的能力,那么打开后你看不到你想要的内容
  2. 什么是文件夹
    1. 装文件的容器,也称为目录或盘符
    2. 举例
      c盘
      user文件夹
  3. 文件的作用
    1. 长久的存储数据(物理构件是硬盘,硬盘好比整个容器)
  4. 如何使用文件(学习java对文件的操作)
    1. 学习哪些API
      1. java.io包中的File类即可
    2. File代表的是什么
      1. 源码(普通类)

      2. 文件路径或目录(不是我们理解的文件名或文件这么简单模糊)
      3. 路径分类(便于操作)
        相对路径:以此时文件所在文件夹路径为起点
        绝对路径:以盘符为起点
        注意
        在java项目中,相对路径的根目录是从项目所在的根文件夹开始的

          在java项目中,路径表示用:\\或//不能用\
              不能用\
        
              要用需要转义:可用\\
        
              或者用/
    3. File的构造方法(重载5个,公开的有3个,没有无参构造方法)
      1. 根据一个字符串构造
      2. 根据两个字符串构造
      3. 根据一个文件对象和一个字符串构造
      4. 说明
        使用构造方法创建的实例,仅是在内存中有这样一File对象,其中path,prefixLength有值了,硬盘中该文件或目录并不存在
      5. 图解
    4. FIle常用的类成员
      1. 成员变量(FileSystem,path,prefixLength)

      2. 成员方法(相当多,掌握常用的)

        createNewFile();//根据指定的路径名称创建文件
        mkdir();//根据指定的路径名称创建目录
        mkdirs();//根据指定的路径名称创建目录,能创建多级目录:如,同时a//b目录

        delete();//根据路径删除文件或目录
        deleteOnExit()//在JVM退出前删除此路径对应的文件或目录

        renameTo(File newFile)//重命名
        setReadableboolean b();//;//用不起
        setWritable(boolean b);//设置是否可写:右键文件,属性,常规中可见到read-only被勾选,修改文件后无法保存,只能另存
        setExecuteable();//用不起

        查状态
        exists();//路径是否存在
        isDictory();//是否是目录
        isFile();//是否是文件
        canRead();//是否可读
        canWrite();//是否可写
        canExecute()//能否执行
        isHidden();//是否隐藏
        isAbsolute();//是否是用的绝对路径
        查内容
        getName();//获取文件名
        getPath();//获取构建的路径
        getParent();//返回父级的路径
        getParentFile();//获取父级File对象,打印是调用的toString()被重写了:返回getPath内容
        length();//文件的字节数,即文件的大小
        list();//得到某个目录下的所有文件或目录
        listFiles();//得到某个目录下的所有文件
        //可以传入filter过滤出符合名称要求的文件或目录
        案例:根据指定的过滤器在指定目录下获取所有的符合过滤条件的文件,并存储到list 集合中

      3. 创建文件或目录的一般步骤
        File file = new File("使用相对路径或绝对路径");
        先查看创建的File对象是否存在,如果已经有了返回false
        如果存在:输出提示"文件或文件夹已存在无法创建"
        如果不存在:根据自己需要创建文件或目录
        说明
        如果没有盘符F你却要在盘符F下创建文件,会抛出IO异常

              IOException是继承Exception要么try-catch处理要么抛出
              createNewFile()方法抛出了IOException
        
              同一个目录不能出现两个同名的文件夹或文件(文件夹和文件也不能同名)
        
          可选方法
              createNewFile();//根据指定的路径名称创建文件
              mkdir()//根据指定的路径名称创建目录
              mkdirs();;//根据指定的路径名称创建目录,能创建多级目录:如,同时a//b目录
  5. 什么是流
    1. https://www.cnblogs.com/biehongli/p/6074713.html
    2. 数据传输的过程就是流
    3. 分类
      1. 根据流的方向(相对的概念,一般以程序为参考)
        1) 输入流:从目的地到程序中
        2) 输出流:数据从程序到目的地
      2. 根据传输数据的大小(实际上都是按位来传递数据的,01传递的)
        1) 字节流:按字节的方式读写数据
        2) 字符流:按字符的方式来读写数据
  6. 流的作用
    1. 数据的传输(文件数据的增删改查都需要流操作)
  7. 流的使用
    1. 学习哪些API
      1. 体系结构一张图
        1)
      2. 体系结构文字说明(有时候图片看上去很过瘾,但是内容太多,还不如几句文字这样才便于记忆)
        1) AutoCloseable:顶级接口,自动关闭能力的接口
        1) AutoCloseable接口只定义了close()方法:void close() throws Exception
        2) jdk1.7新增顶级接口,被打包到java.lang包中
        3) 为try语句自动关闭资源的能力提供了支持
        1) 作用
        不太可能会忘记关闭流
        可以使源代码更短,更清晰,更容易维护
        2) 语法
        try
        (
        资源实例
        )
        {
        操作代码
        }catche(异常对象){

        }
        3) 说明
        通过使用分号分隔每个声明可以管理多个资源
        在try代码中声明的资源被隐式声明为fianl
        4) 举例

         4) Closeable扩展了AutoCloseable。因此,在JDK7中,所有实现了Closeable接口的类也都实现了AutoCloseable接口

        2) Closeable:能关闭能力的接口
        1) AutoCloseable接口的子接口
        2) 只定义了close()方法,jdk1.5就有了
        3) Flushable:清缓存能力的接口
        1) 可缓冲区中的数据发送出去,不必等到缓冲区满后发送
        4) 输入流:都实现了Closeable接口
        1) 字节:InputStream:顶级父类,它是抽象类,实现了Closeable接口,以字节方式操作输入流
        常用的成员方法
        read([字节数组][,起始下标][,读取长度]);
        available();
        close();
        成员方法图解

              子类
                  FileInputStream常用构造函数图解
        
                  FilterInputStream:包装InputStream的副本
        
                      子类
                          BufferedInputStream常用构造函数图解
        
                          DataInputStream常用构造函数图解
        
                  ObjectInputStream:常用构造函数与方法图解
        
         2) 字符:Reader:顶级父类,它抽象类,,实现了Closeable接口,以字符方式操作输入流
              常用的成员方法
                  read();
              常用的成员方法图解
        
              子类
                  InputStreamReader:常用构造函数与方法图解
        
                      子类
                          FileReader
        
                  BufferedReader常用构造函数与方法图解

        5) 输出流:都实现了Flushable接口(层次结构完全相同,操作相反)
        1) 字节:OutputStream
        常用成员方法
        write(int[,起始下标][,读取长度]);
        flush();
        close();
        成员方法图解

              子类
                  FileOutputStream:常用构造函数图解
        
                  FilterOutputStream:同FilterInputStream,流向变了
                  ObjectOutputStream:常用构造函数与方法图解
        
         2) 字符:Writer
              常用成员方法
                  write()
                  append()
                  flush();
                  close();
              常用成员方法图解
        
              子类(同输入流)
      3. 常用类,以输入流为例
        1) 字节流
        a) BufferedInputStream:首选,内容量大时效率高
        b) FileInputStream:其次选普通的
        c) ObjectInputStream:如果要反序列化(该对象必须实现Serializable接口,来声明其是可以序列化的。否则,不能用对象流读写)
        2) 字符流
        a) BufferedReader:首选带缓冲的,内容量大时效率高
        b) FileReader:其次选普通的
        c) InputStreamReader:如果需要指定字符编码方式就只能用这个了
      4. 构造实例时的包装顺序,以输入流为例(File实例+InputStream = 所有类的构造参数)
        1) File实例是所有流的基础
        2) 然后是InputStream实例,由FileInputStream实例化
        3) 然后是Reader实例,由InputStreamReader实例化

      5. 输入输出常用方法对比
        输入 输出
        read() write()
        available() flush()
        readLine() append();
        readObject() newLine()
        writeObject();
        都有close()方法
    2. 说明
      1. 缓存流是如何提高读写效率的
        1) 把要发的数据先放到缓冲区,缓冲区放满以后再一次性发过去,而不是分开一次一次地发
      2. 不使用flush(),能否保证输出流写出的数据完整
        1) 不能:flush():这个是代表刷新缓冲区的意思,没有用flush()这个方法,很多情况下会出现流的另一边读不到数据的问题,特别是在数据特别小的情况下.
        2) 一般write()方法后必须跟一个flush()以释放buffer
      3. append()方法与write方法的区别
        1) append可以添加null的字符串,输出为"null"而write会抛出空指针异常
        2) append不仅可写普通字符串也能写可变字符串,而write只能写普通字符串

猜你喜欢

转载自www.cnblogs.com/River111/p/9616592.html