17 IO流
1. IO流
- 文件
文件在程序中是以流的形式来操作的。
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
- 常用的文件操作
- 获取文件的相关信息
- IO流原理及流的分类
I/O (Input/Output) 技术,用于处理数据传输。如读/写文件,网络通讯等。
* 按操作数据单位:
* 字节流(8 bit)(方便二进制文件操作)(以字节为单位读取)
* 字符流(方便文本文件操作)(按字符为单位)
* 按数据流的流向:
* 输入流
* 输出流
* 按流的角色:
* 节点流
* 处理流/包装流
- 对象流
ObjectOutputStream 提供序列化功能(序列化:保存数据的值和数据类型)
ObjectInputStream 提供反序列化功能(反序列化:恢复数据的值和数据类型)
需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现两个接口之一:
Serializable // 这是一个标记接口,没有方法
Externalizable // 该接口有方法需要实现,因此一般都实现 Serializable 接口
String filePath = "C:\\CloudMusic\\try.dat"; // 这里后缀不管定义什么,最后都会按Java自己的后缀dat保存
ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream(filePath));
ois.writeInt(100);
ois.writeBoolean(true);
ois.writeUTF("韩顺平");
ois.writeObject(new User(10,27,"ZhangSan"));
ois.close();
System.out.println("ok=========");
ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream(filePath));
System.out.println(ois2.readInt()); // 100
System.out.println(ois2.readBoolean()); // true
System.out.println(ois2.readUTF()); // 韩顺平
User us1 = (User)ois2.readObject(); // 注:User对象要实现Serializable接口。且对本类来说,拥有可引用的权限,才能正确读取
System.out.println(us1); // User{id=10, age=27, name='ZhangSan'}
System.out.println(us1.getName()); // ZhangSan
ois2.close();
使用细节:
1) 读写顺序要一致
2)要求序列化或反序列化的对象,要实现 Serializable
3)序列化的类中建议添加 SerialVersionUID,为了提高版本的兼容性
4)序列化对象时,默认将里面所有属性都进行序列化,但除了 static 或 transient 修饰的成员
5)序列化对象时,要求里面属性的类型也需要实现序列化接口
6)序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
- 标准输入输出流
System.in
编译类型:InputStream
运行类型:BufferedInputStream
System.out
编译类型:PrintStream
运行类型:PrintStream
- 转换流
解决文件乱码问题
InputStreamReader:Reader 的子类,可以将 InputStream(字节流) 包装/转换成 Reader(字符流)
OutputStreamWriter:Writer 的子类,实现将 OutputStream(字节流) 包装/转换成 Writer(字符流)
当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换为字符流
字节流文件可以在使用时指定编码格式(比如 utf-8, gbk, gb2312, ISO8859-1 等),再通过转换流转成字符流
- 打印流
打印流只有输出流,没有输入流
在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
可以自己修改打印流输出的位置/设备
System.setOut(new PrintStream("C:\\CloudMusic\\test.txt"));// 修改输出到文件
System.out.println("hello, 韩顺平教育~");
2. Properties 类
-
基本介绍
Properties 类是 HashTable 的一个子类,专门用于读写配置文件的集合类,配置文件的格式:
键=值
键=值
(注意:键值对不需要有空格,值不需要用引号引起来,默认类型是 String -
常见方法