Java中的IO流
概述:
一、IO流原理及流的分类
流的分类
- 按操作数据单位不同分为:字节流(8bit)(二进制文件),字符流(按字符)(文本文件)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色的不同分为:节点流,处理流/包装流
二、Java操作文件方式
1、创建文件
1 | 1. new File(String pathName); //根据路径创建一个File对象 |
在创建文件对象后,对象只是存储在内存中,并没有实际在硬盘中创建,需要调用文件对象的 createNewFile() 方法才可真正创建。
1 | public static void main(String[] args) { |
2、 获取文件信息方法
- getName //获取文件名
- getAbsolutePath //获取绝对路径
- getParent //获取文件父级目录
- length //获取文件字节数
- exists //判断文件是否存在,返回bool类型
- isFile //判断是否是文件,bool类型
- isDirectory //判断是否是目录,bool类型
3、 创建目录
用mkdir方法,如果要创建多级目录,用mkdirs方法。
4、 删除文件或者目录
用Delete方法,当用delete方法删除目录时,只能用来删除空目录。
三、流
1. 字节流(二进制文件)
- InputStream 字节输入流
- OutputStream 字节输出流
如:拷贝图片文件
1 | //将 1.jpg 文件中的内容读取到 2.jpg 中 |
2. 字符流(文本文件)
- Reader 字符输入流
- Writer 字符输出流
对应方法有:
3. 处理流
四、字节流和处理流
注意:字节是最基本的单位,字节流既可以处理二进制文件,也可以处理字符文件
1. 处理流 BufferedReader 和 BufferedWriter
- BufferedReader 和 BufferedWriter 属于字符流,是按照字符来读取数据的,不能操作二进制文件
- 关闭处理流时,只需要关闭外层流即可(外层流指高级的那层流)
1 | BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); |
关闭时,只需要关闭最外层即可
1 | bufferedReader.close(); |
常用方法:
- BufferedReader
- readLine 读取一行,但并不会读取换行符
- BufferedWriter
- newLine 插入一个与系统相关的换行
- write 多种重载,写入文件
2. 处理流 BufferedInputStream 和 BufferedOutputStream
- BufferedInputStream 和 BufferedOutputStream 是字节流,处理二进制文件
3. 对象流 ObjectInputStream 和 ObjectOutputStream
- 顾名思义,对象流就是可以把一个对象保存到文件(序列化)或者把对象从文件中读取出来(反序列化)
- 序列化和反序列化
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,而为了让某个类是可序列化的,该类必须实现如下两个接口之一
- Serializable //这时一个标记接口
- Externalizable
1 | //序列化示例 |
注意事项:
读写顺序要一致
序列化和反序列化所使用的类一定要是同一个类,因为在序列化的过程中,会把包信息也加入在内
serialVersionUID 是序列化的版本号,可以提高兼容性(在类中新增属性时,只要版本号相同,他也会认为是同一个类。例如:private static final long serialVersionUID = 1L;
序列化对象时,默认将里面所有的属性都进行序列化,但除了static 和 transient 修饰的成员
序列化对象时,要求里面属性的类型也需要实现序列化接口
序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
要求序列化或反序列化对象,需要实现 Serializable 接口
4. 标准输入输出流
System.in 和 System.out
System 类的 public final static InputStream in = null
System.in 的编译类型 InputStream, 运行类型 BufferedInputStream(对应键盘)
System.out 的编译类型 PrintStream,运行类型 PrintStream(对应屏幕/显示器)
5. 转换流
InputStreamReader 和 OutputStreamWriter
作用:字节流转成字符流,可以解决字符乱码问题
使用:
- InputStreamReader 是 Reader 的子类,可以将 InputStream(字节流)包装/转换成 Reader(字符流)
- OutputStreamWriter 是 Writer 的子类,可以将 OutputStream(字节流)包装/转换成 Writer(字符流)
- 当处理纯文本的数据时,使用字符流效率往往会更高,而且可以解决中文乱码的问题
- 可以在使用时指定文件编码格式(比如 utf-8,gbk 等)
1 | //将a.txt用字节流方式打开并转成utf-8字符流形式,然后再包装成处理流 |
6. 打印流
PrintStream 和 PrintWriter
打印流只有输出流,没有输入流,打印并不一定打印到屏幕上,也可以打印到文件里,网页上等等( 用System.setOut(); 方法 )。
- PrintStream 是字节流,PrintWriter 是字符流
五、Properties类
专门用于读写配置文件的集合类
配置文件格式:
键1=值1
键2=值2
注意:键值对不需要有空格,值不需要用引号引起来,默认是 String 类型
Properties常用方法
- load 加载配置文件的键值对到 Properties 对象
- list 将数据显示到指定设备
- getProperty(key) 根据键获取值
- setProperty(key, value) 设置键值对到 Properties 对象(底层还是哈希表)
- store 将 Properties 中的键值对存储到配置文件,在 idea 中,保存信息到配置文件,如果含有中文,会存储为 unicode 码