​Java基础复习笔记 ​第15章:File类与IO流#​

1. File类的使用

1. File类的理解
> File声明在java.io包下的。
> File类的对象可以表示一个文件或一个文件目录。
> File类中包含了关于文件、文件目录的新建、删除、重命名、查询所在路径、获取文件大小等方法。
  但是不包含读写文件内部内容的方法。要想读写文件内容,我们需要使用IO流。
> File类的对象常作为IO流读写数据的端点出现:常作为IO流的构造器的形参出现。


2. 内部api使用说明
2.1 构造器
* `public File(String pathname) ` :以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
* `public File(String parent, String child) ` :以parent为父路径,child为子路径创建File对象。
* `public File(File parent, String child)` :根据一个父File对象和子文件路径创建File对象


2.2 方法
 1、获取文件和目录基本信息
* public String getName() :获取名称
* public String getPath() :获取路径
* `public String getAbsolutePath()`:获取绝对路径
* public File getAbsoluteFile():获取绝对路径表示的文件
* `public String getParent()`:获取上层文件目录路径。若无,返回null
* public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
* public long lastModified() :获取最后一次的修改时间,毫秒值

2、列出目录的下一级

* public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
* public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

3、File类的重命名功能
- public boolean renameTo(File dest):把文件重命名为指定的文件路径。

4、判断功能的方法
- `public boolean exists()` :此File表示的文件或目录是否实际存在。
- `public boolean isDirectory()` :此File表示的是否为目录。
- `public boolean isFile()` :此File表示的是否为文件。
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean isHidden() :判断是否隐藏

5、创建、删除功能
- `public boolean createNewFile()` :创建文件。若文件存在,则不创建,返回false。
- `public boolean mkdir()` :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- `public boolean mkdirs()` :创建文件目录。如果上层文件目录不存在,一并创建。
- `public boolean delete()` :删除文件或者文件夹
  删除注意事项:① Java中的删除不走回收站。② 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

3. 概念:
绝对路径:在windows操作系统中,以盘符开始的路径。

相对路径:相较于某个指定路径下的具体路径。
        单元测试方法:相较于当前的module
        main():相较于当前的工程

2. IO流的概述

  • 流的分类
    • 流的流向:输入流、输出流
    • 操作的数据单位:字节流、字符流
    • 角色的不同:节点流、处理流
  • 4个抽象基类
  • 整个流这一章涉及到的具体的流的使用,操作的步骤都是标准规范的。
    • 步骤1:创建File的对象
    • 步骤2:创建流的对象,构造器中需要传入File的对象
    • 步骤3:读取、写出操作的细节
    • 步骤4:关闭资源

3. 文件流的使用

  • FileInputStream与FileOutputStream、FileReader与FileWriter

  • 注意点1:

注意点:
> 因为涉及到资源的关闭,所有异常的处理需要使用try-catch-finally结构替换throws
> 对于输入流来讲,File对象对应的物理磁盘上的文件必须存在。否则,报FileNotFoundException
  对于输出流来讲,File对象对应的物理磁盘上的文件可以不存在。
        > 如果不存在,则在输出的过程中,会自动创建指定名的文件
        > 如果存在,如果使用的是FileWriter(File file)或FileWriter(File file,false)构造器,则在输出的过程中,会覆盖已有的文件
          如果存在,如果使用的是FileWriter(File file,true)构造器,则在输出的过程中,会在现有文件末尾追加内容。
> 务必记得关闭资源,否则出现内存泄漏
  • 注意点2:
> FileReader \ FileWriter :主要用来处理文本文件
  对于非文本文件的处理是失败的。

> FileInputStream \ FileOutputStream:主要用来处理非文本文件。

> 文本文件:.txt、.java、.c、.cpp、.py
  非文本文件:.doc、.jpg、.png、.avi、.mp3、.mp4、.ppt

4. 处理流之一:缓冲流

  • BufferedInputStream与BufferedOutputStream、BufferedReader与BufferedWriter

  • 作用:加快文件的读写效率。

  • 原理:内部提供了缓冲区(数组实现的),减少和磁盘交互的次数。

  • 4个缓冲流                   使用的方法
    处理非文本文件的字节流:
    BufferedInputStream        read(byte[] buffer)
    BufferedOutputStream       write(byte[] buffer,0,len) \ flush()
    
    处理文本文件的字符流:
    BuffferedReader            read(char[] buffer)\readLine()
    BufferedWriter             write(char[] buffer,0,len) \ flush()
    
    3. 实现的步骤
    
    第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. 处理流之二:转换流

  • InputStreamReader和OutputStreamWriter

  • 基本使用

  • 1. 复习
    
    字符编码:字符、字符串 ----> 字节、字节数组。对应着编码集
    字符解码:字节、字节数组 ---> 字符、字符串。对应着解码集
    
    2. 如果希望程序在读取文本文件时,不出现乱码,需要注意什么?
    使用的解码集必须与当初保存文本文件使用的编码集一致。
    

6. 处理流之三:对象流

  • 了解:数据流:DataInputStream 、DataOutputStream

    • 读写8种基本数据类型的变量、String、字节数组
  • 掌握:ObjectInputStream、ObjectOutputStream

    • 读写8种基本数据类型的变量、对象(readObject();writeObject(Object obj))
  • 掌握:对象的序列化机制

    • 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

    • 序列化过程:将内存中的Java对象转换为二进制流,保存在文件中或通过网络传输出去。
      使用ObjectOutputStream
      
      反序列化过程:将文件中或者通过网络接收到的二进制流转换为内存中的Java对象
      使用ObjectInputStream
      
  • 熟悉:自定义类要想实现序列化机制,需要满足:

    > 必须实现接口Serializable。 (此接口中没有抽象方法,称为标识接口)
    > 类中必须显式声明一个全局常量serialVersionUID,用于唯一标识当前类本身。
      如果不显式声明,系统会自动分配一个serialVersionUID,但是此属性在类修改的情况下,可能被改变。不建议使用默认情况。
    > 自定义类的所有属性也必须是可以序列化的。满足上述的两个条件。
      特别的:基本数据类型、String类型本身已经是可以序列化的了。
    
    
    6.注意点:
    > 类中声明为static或transient的变量,不能实现序列化。
    

7. 其它流的使用

  • 标准的输入、输出流
System.in: 默认的输入设备:键盘
System.out: 默认的输出设备:显示屏
  • 打印流
PrintStream和PrintWriter
  • 使用第三方框架

    • apache-common包
  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值