File类与IO流复习和总结

1.File类的使用

  • File类的一个实例就对应着磁盘上的一个文件或着文件目录 ---->万事万物皆对象
  • File的方法:
获取文件和目录基本信息1                
    - public String getName() :获取名称
    - public String getPath() :获取路径
    - `public String getAbsolutePath()`:获取绝对路径
    - public File getAbsoluteFile():获取绝对路径表示的文件
    - `public String getParent()`:获取上层文件目录路径。若无,返回null
    - public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
    - public long lastModified() :获取最后一次的修改时间,毫秒值
列出目录的下一级
    - public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
    - public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
File类的重命名功能
    - public boolean renameTo(File dest):把文件重命名为指定的文件路径。
判断功能的方法
    - `public boolean exists()` :此File表示的文件或目录是否实际存在。
    - `public boolean isDirectory()` :此File表示的是否为目录。
    - `public boolean isFile()` :此File表示的是否为文件。
    - public boolean canRead() :判断是否可读
    - public boolean canWrite() :判断是否可写
    - public boolean isHidden() :判断是否隐藏
创建、删除功能
    - `public boolean createNewFile()` :创建文件。若文件存在,则不创建,返回false- `public boolean mkdir()` :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
    - `public boolean mkdirs()` :创建文件目录。如果上层文件目录不存在,一并创建。
    - `public boolean delete()` :删除文件或者文件夹
删除注意事项:① Java中的删除不走回收站。② 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

  • File类中声明了新建、删除、获取名称、重命名等方法,并没有涉及到文件内容的读写操作
    要想实现文件内容的读写,我们就需要使用io流
  • 关于路径的理解
绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径

相对路径:相对于某一个文件目录来讲的相对路径的位置
             在idea中,如果使用单元测试方法:相当于当前的module来讲
                      如果使用main()方法:相对于当前的project来讲

2.IO流的概述

  • IO流的分类
    • 流向:输入流、输出流
    • 处理数据的单位:字节流、字符流
    • 流的角色:节点流、处理流
  • IO的4个抽象基类:InputStream、OutputStream、Reader、Write

3.节点流之:文件流

  • FileInputStream、FileOutputStream、FileReader、FileWrite
  • (掌握)读写数据的过程
    • 步骤1:创建File类的对象,作为读取或写出数据的端点
    • 步骤2:创建相关流的对象(FileReader、FileWrite)表示字符流,( FileInputStream、 FileOutputStream)表示字节流
    • 步骤3:读取、写出数据的过程
    • 关闭流资源
    • 具体实现步骤
3. FileReader \ FileWriter 的使用
3.1 执行步骤:
第一步:创建读取或写出的File类的对象
第二步:创建输入流或输出流
第三步:具体的读入或写出的过程
      读入:read(char[] cbuffer)
      写出:write(String str) / write(cher[] cbuffer,0,len)
第四步:关闭流资源,避免内存泄露

3.2 注意点:
①因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常
②对于输入流来讲,要求File类的对象对应物理磁盘上的文件必须存在,否则,会报FileNotFoundException
 对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在
    >如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中
    >如果此文件存在,使用 FileWriter(File file)FileWriter(File file,false):输出数据过程中,
                会新建重名的文件对现有的文件进行覆盖
          FileWriter(File file,true):输出数据的过程中,会在现有的文件末尾追加写入内容

4. FileInputStream \ FileOutputStream 的使用
4.1 执行步骤:
第1:创建读取或写入的File类的对象
第2:创建输入流和输出流
第3:具体的读入或写出的过程
      读入:read(byte [] buffer)
      写出:write(byte [] buffer,0,len)4:关闭流资源,避免内存泄漏

4.2 注意点:
①因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常
②对于输入流来讲,要求File类的对象对应物理磁盘上的文件必须存在,否则,会报FileNotFoundException
 对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在
    >如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中
    >如果此文件存在,使用  FileInputStream(File file)FileInputStream(File file,false):输出数据过程中,
                                                 会新建重名的文件对现有的文件进行覆盖
                       FileOutputStream(File file,true):输出数据的过程中,会在现有的文件末尾追加写入内容
---附加其他的注意点
>对于字符流,只能用来操作文本文件,不能用来处理非文本文件的
 对于字节流,通常是用来处理非文本文件的,但是,如果涉及到文本文件的复制操作,也可以使用字节流操作


说明:
文本文件:.txt 、.java、.c 、.cpp 、.py等
非文本文件:.doc、.xls、.jpg 、.pdf、.mp4、.avi 等

4.处理流之一:缓冲流

  • BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWrite
  • 作用:提升文件读写的效率
  • 操作方法
4个缓冲流                           使用的方法
处理非文本文件的字节流:
BufferedInputStream           read(byte[] buffer)
BufferedOutputStream          write(byte[] buffer,0,len) / flush()

处理文本文件的字符流:
BufferedReader                read(char[] cBuffer) / readLine()
BufferedWriter                write(char [] cBuffer,0,len) / write(String ) / flush()

实现的步骤

第1步:创建File的对象、流的对象(包括文件流、缓冲流)

第2步:使用缓冲流实现 读取数据 或 写出数据的过程(重点)
    读取:int read(char[] cbuf/byte[] buffer) : 每次将数据读入到cbuf/buffer数组中,并返回读入到数组中的字符的个数
    写出:void write(String str)/write(char[] cbuf):将str或cbuf写出到文件中
         void write(byte[] buffer)byte[]写出到文件中

第3步:关闭资源

5.处理流之二:转换流

  • 作用:实现字节与字符之间的转换
  • 层次1:熟悉转换流的使用
    • InputStreamReader:将一个输入型的字节流转换为输入性的字符流
    • OutputStreamWriter:将一个输出型的字符流转换为一个输出型的字节流
  • 层次2:(掌握)字符的编码和解码的过程、常用的字符集
    • 解决相关的问题:读写字符的过程中出现乱码!本质的问题:使用的解码集和编码集不一致导致乱码

6.处理流之三:对象流

  • 层次1:熟悉对象流的使用
    • ObjectInputStream:反序列化时需要的API
    • ObjectOutputStream:序列化时需要使用的API
两个过程使用的流:
序列化过程:使用ObjectOutputStream流实现,将内存中的java对象保存在文件中或通过网络传输出去

反序列化过程:使用ObjectInputStream流实现,将文件中的数据或网络传输过来的数据还原为内存
中java中的对象
  • 层次2:对象的序列化机制
    • 使用的场景:不同的进程之间通信、客户端(或浏览器端)与服务器端传输数据
    • 自定义类要想实现序列化机制需要满足的要求即注意点
自定义类要想实现序列化机制,需要满足:
①自定义类需要实现接口:Serializable
②要求自定义类声明一个全局常量: static final long serialVersionUID = 42122333243L;
 用来唯一的标识当前的类
③要求自定义类的各个属性也必须是可序列化的
  >对于基本数据类型的属性:默认就是可以序列化的
  >对于引用数据类型的属性:要求实现Serializable接口~

注意点:
①如果不声明全局常量serialVersionUID,系统会自动生成一个针对于当前类的serialVersionUID
如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException异常
②类中的属性如果声明transientstatic,则不会实现序列化

7.其他流的使用

  • 了解:数据流:DataInputStream、DataOutputStream
  • 了解:标准的输入流、标准的输出流:System.in、System.out
  • 了解:打印流:PrintStream、PrintWriter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

死磕java的孤行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值