标题
- 1. 文件基础知识
- 1.1 文件基础知识-文件流
- 1.2 创建文件的3种方式(不是目录)
- 3. 获取文件的相关信息
- 4. 删除文件及创建多级(一极)目录
- 2. IO流原理及流的分类
- 2.1 InputStream 字节输入流
- 2.1.1 FileInputStream
- 2.1.2 FileOutStream
- 2.1.3 拷贝文件
- 2.2 FileReader
- 2.3 FileWriter
- 2.4 节点流与处理流
- 2.4.1 处理流设计模式
- 2.4.2 BufferedReader
- 2.4.3 BufferedWriter
- 2.4.4 Buffered字符流拷贝
- 2.5 BufferedInputStream
- 2.6 BufferedOutputStream
- 2.6.1 Buffered字节流拷贝
- 2.7 对象流
- 2.7.1 ObjectOutputStream
- 2.7.2 ObjectInputStream
- 2.7.3 对象流使用细节
- 2.8 标准输入输出流
- 2.9 转换流
- 2.9.1 InputStreamReader
- 2.9.2 OutputStreamWriter
- 3.0 打印流
- 3.1 字节打印流
- 3.2 字符打印流
- 3.1 Properties类
1. 文件基础知识
1.1 文件基础知识-文件流
- 文件基础知识-文件流:文件在程序中是以流的形式来操作的
1.2 创建文件的3种方式(不是目录)
- 根据路径创建一个File对象
- 根据父目录文件+子路径创建
- 根据父目录+子路径传创建
3. 获取文件的相关信息
File类图
4. 删除文件及创建多级(一极)目录
- 1 删除文件
4.2 删除目录 : 目录可以当作一个文件
4.3 创建多级目录用mkdirs
2. IO流原理及流的分类
-
IO流原理
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中;
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中; -
流的分类
按操作数据单位不同分为:字节流(8 bit)对于二进制文件,字符流(按字符) 对应文本文件
按数据流的流向不同分为:输入流、输出流
按流的角色不同分为:节点流、处理流/包装流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
2.1 InputStream 字节输入流
InputStream抽象类是所有类字节输入流的超类;
2.1.1 FileInputStream
- 演示读取文件(单个字节的读取,效率比较低)
- 多个字节的读取
2.1.2 FileOutStream
- 将数据写入文件中 (写入单个字节),如果文件不存在,则创建文件;
2.写入字符串(先把字符串转换成字节数组)
3.1 写入字符串时,可以定义起始位置
write(byte b[], int off, int len); off是偏移量,len是写入的个数
- 将数据写入文件时,如果希望写入文件的末尾而不是开头
2.1.3 拷贝文件
可以拷贝图片,也可以拷贝音乐;
2.2 FileReader
单个字符读取
多个字符读取
2.3 FileWriter
细节
- 如果不指定true,会默认覆盖文件的内容。
- FileWriter使用过后,一定要关闭(close)或者刷新(flush),否则数据流不能写入到文件! 原因:
源码如下:Force Step Into
2.4 节点流与处理流
- 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
- 包装流(处理流) 是“连接”在已存在的流(节点流或处理流)之上,如BufferedReader、BufferedWriter;
2.4.1 处理流设计模式
- 节点流和处理流的区别和联系
- 节点流是底层流/低级流,直接跟数据源相接;
- 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
- 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连;【模拟修饰器设计模式】。
- 处理流的功能主要体现在以下两个方面:
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率;
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便;
2.4.2 BufferedReader
- BufferedReader和BufferWriter属于字符流,是按照字符来读取数据的;
- 关闭处理流的时候,只需要关闭外层流即可;源码:
in就是我们传入的new FileReader(filePath)i;
2.4.3 BufferedWriter
- BufferedWriter构造器不支持传入一个boolean参数,所以在字节流处添加;
2.4.4 Buffered字符流拷贝
BufferedReader和BufferedWriter只能操作字符,字符流只能读取文本;
不能读取二进制文件【音频,视频,文档,图片】,造成文件损坏;
2.5 BufferedInputStream
2.6 BufferedOutputStream
2.6.1 Buffered字节流拷贝
字节流可以操作二进制文件,但可以操作文本文件吗?可以:不要把汉字的字节拆开就不会乱码!
2.7 对象流
- 序列化和反序列化
- 序列化就是在保存数据的同时,还能保存数据的类型;
- 反序列化就是在恢复数据时,恢复数据的值和数据类型;
- 需要让某个对象支持序列化机制,就必须让其类是可序列化的;为了让某类是可序列化的,则必须让其类下面两个接口之一:
- 实现Serializable接口,这是一个标记接口,没有方法;
- 实现Externalizable接口,这个接口内有方法,需要实现,所以一般不采用;
2.7.1 ObjectOutputStream
使用ObjectOutputSteam序列化基本数据类型和一个Dog对象(age),并保存到data.txt文件中
2.7.2 ObjectInputStream
使用ObjectInputStream读取data.txt并反序列化恢复文件;
2.7.3 对象流使用细节
- 读写顺序要一致;
- 要求序列化或反序列化对象,需要实现Serializable;
- 序列化的类中建议添加SerialVersionUID,以提高版本的兼容性;
- 序列化对象时,默认将里面所有的属性都进行序列化,除了static和transient修饰的成员;
- 序列化对象时,要求里面属性的类型也需要实现序列化接口;
- 序列化具备可继承性,也就是如果某一个类实现了序列化,那么它的子类默认实现序列化;
2.8 标准输入输出流
2.9 转换流
2.9.1 InputStreamReader
InputStreamReader是Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
读取文件内容默认是按照utf-8处理,如果把文件编码改成gbk,那么读取文件时就会出现中文乱码,这时需要用到转换流
2.9.2 OutputStreamWriter
OutputStreamWriter是Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流);
当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
3.0 打印流
打印流只有输出流,没有输入流
3.1 字节打印流
3.2 字符打印流
3.1 Properties类
- 配置文件的读取写入☞传统方案
- 引入Properties
Properties是Hashtable的子类,配置文件的格式:
键=值
键=值
键值对不需要有空格,值不需要用引号括起来,默认是String
load | 加载配置文件的键值对到Properties对象 |
---|---|
list | 将数据显示到指定设备 |
getProperty(key) | 根据建获取值(键、值均是String类型) |
get(key) | 根据建获取值(返回Object对象) |
setPropertiy(key,value) | 设置键值对到Properties对象, 没有key相当于添加 |
store | 将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,则会将汉字存储为unicode码 |
get(key)返回Object类型的对象
Properties父类是Hashtable,底层是Hashtable
setProperties()底层源码是Hashtable中的put方法