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包
相关推荐
余炜yw几秒前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上几秒前
JMeter学习
java·后端·学习·jmeter·微服务
篝火悟者1 分钟前
问题-python-运行报错-SyntaxError: Non-UTF-8 code starting with ‘\xd5‘ in file 汉字编码问题
开发语言·python
Kenny.志3 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
Death2004 分钟前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半8885 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
惜.己5 分钟前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
不修×蝙蝠6 分钟前
八大排序--01冒泡排序
java
niu_sama9 分钟前
基于muduo库函数实现protobuf协议的通信
开发语言·qt
不写八个11 分钟前
Qt教程(001):Qt概述与安装
开发语言·qt