食用前说明:
本文章内容来自B站韩顺平老师的课堂笔记,本人只是将其进行自我整理,内容有所删减,韩顺平老师的B站课程AV号:BV1fh411y7R8
本文章内容来自韩顺平老师的课堂笔记的 第19章 IO流
19.1 文件流
流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径
19.2 常用的文件操作
19.2.1 创建文件对象相关构造器和方法
相关方法
new File(String pathname) //根据路径构建一个File对象 new
File(File parent,String child) //根据父目录文件+子路径构是 new
File(String parent,String child) //根据父目录+子 子路径
reateNewFile 创建新文件
19.2.2 获取文件的相关信息
getName | getAbsolutePath |
---|---|
getParent | lengh |
isFile | exists |
isDirectory |
19.2.3 目录的操作和文件删除
功能 | |
---|---|
mkdir | 创建一级目录 |
mkdirs | 创建多级目录 |
delete | 删除空目录或文件 |
19.3 IO 流原理及流的分类
19.3.1 Java IO 流原理
I/O是 Input / Output 的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。
Java 程序中,对于数据的输入/输出操作以 ”流(stream)” 的方式进行。
java.io包下提供了各种 “流” 类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
输入 input:读取外部数据(磁盘、光盘等存储设备的数 据)到程序(内存)中。
输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中
19.3.2 流的分类
-
按操作数据单位不同分为:字节流 (8 bit) 二进制文件,字符流 (按字符) 文本文件
-
按数据流的流向不同分为:输入流,输出流
-
按流的角色的不同分为:节点流,处理流/包装流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
Java 的 IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
19.4 IO 流体系图-常用的类
19.4.1 FileReader 相关方法
new FileReader (File / String)
read:每次读取单个字符,返回该字符,如果到文件末尾返回 -1
read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件未尾返回 -1
相关API:
new String(char[]):将 char[] 转换成 String
new String(char[],off,len):将 char[] 的指定部 换成 String
19.4.2 FileWriter 常用方法
功能 | |
---|---|
new FileWriter(File/String) | 覆盖模式,相关于流的值针在尾端 |
new FileWriter(File/String,true) | 追加模式,相当于流的指针在尾端 |
write(int) | 写入单个字符 |
write(char[]) | 写入指定数组 |
write(char[],off,len) | 写入指定数组的指定部分 |
write(string) | 写入整个字符串 |
write(string,off,len) | 写入字符串的指定部分 |
相关API
String类: toCharArray
将 String 转换成 char[]
❗ 注意:
FileWriter使用后,必须要关闭 (close) 或 刷新 (flush),否则写入不到指定文件
19.5 节点流和处理流
19.5.1 节点流和处理流的区别和联系
节点流是底层流/低级流,直接跟数据源相接。 处理流(包装流)包装节点流,既[源码理解] 处理流(也叫包装流)
区别 / 联系 | |
---|---|
节点流 | 底层流 (低级流) ,直接跟数据源相接 |
处理流(包装流) | 1. 包装 节点流 ,可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。 |
-
对
节点流
进行包装,使用了修饰器设计模式,不会直接与数据 |
19.5.2 处理流的功能主要体现在以下两个方面:
-
性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
-
操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
19.5.3 处理流-BufferedReader 和 BufferedWriter
属于 | 操作 | |
---|---|---|
BufferedReader | 字符流 | 是关闭时处理流,只需要关闭外层流即可 |
BufferedWriter | 字符流 | 是关闭时处理流,只需要关闭外层流即可 |
19.5.4 处理流-BufferedInputStream 和 BufferedOutputStream
-
BufferedInputStream 是字节流,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
-
BufferedOutputStream 是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统
19.5.5 对象流-ObjectInputStream 和 ObjectOutputStream
序列化和反序列化
序列化就是在保存数据时,保存数据的值和数据类型
反序列化就是在恢复数据时,恢复数据的值和数据类型
需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
Serializable //这是一个标记接口,没有方法
Externalizable //该接口有方法需要实现,因此我们一般实现上面的 Serializable 接口
19.5.6 对象流介绍
功能:提供了对基本类型或对象类型的序列化和反序列化的方法
提供功能 | |
---|---|
ObjectOutputStream | 序列化功能 |
ObjectInputStream | 反序列化功能 |
读写顺序要一致
要求字列化或反序列化对象,需要 实现 Serializable
序列化的类中建议添加 SerialVersionUID,为了提高版本的兼容性
序列化对象时,默认将里面所有属性都进行序列化,但除了 static 或 transient 修饰的成员
序列化对象时,要求里面属性的类型也需要实现序列化接口
序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
19.5.7 标准输入输出流
类型 | 默认设备 | ||
---|---|---|---|
标准输入 | System.in | InputStream | 键盘 |
标准输出 | System.out | PrintStream | 显示器 |
19.5.8 转换流-InputStreamReader 和 OutputStreamWriter
InputStreamReader :Reader 的子类,可以将 InputStream (字节流) 包装成(转换) Reader (字符流)
OutputStreamWriter :Writer 的子类,实现将 OutputStream (字节流) 包装成 Writer (字符流)
当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
可以在使用时指定编码格式 (比如 utf-8,gbk,gb2312,ISO8859-1 等)
19.6 Properties 类
19.6.1 基本介绍
专门用于读写配置文件的集合类 配置文件的格式: 键 = 值 键 = 值
注意:键值对不需要有空格,值不需要用引号一起来。默认类型是 String
Properties 的常见方法
功能 load 加载配置文件的键值对到Properties对象 list 将数据显示到指定设备 getProperty(key) 根据键获取值 setProperty(key,value) 设置键值对到Properties对象 store 1. 将Properties中的键值对存储到配置文件
-
在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码 |