操作对象:
通过流,将对象保存到硬盘上
ObjectOutputStream
构造函数中接收流
通过方法writeObject(Object obj)操作对象
被操作的对象需要实现Serializable接口,使对象序列化,标识对象
需要注意:static修饰的属性不能被序列化
如果希望非静态属性也不被序列化,则在属性前面加上trasient修饰
管道流:(涉及到多线程)
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接
该流对象是阻塞式的,读取流读到数据才会继续执行,否则会一直等待,直到读到数据
连接有两种方法:
1, 直接将流对象做为构造函数的参数传入彼此
2, 分别创建对象后通过connect()方法连接
代码演示:
RandomAccessFile
支持随机访问文件的读取和写入
该类不是IO体系中子类
而是直接继承自Object。
但是它是IO包中的成员,因为它具备读和写功能
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置。
同时可以通过seek改变指针的位置
其实完成读写的原理就是内部封装了字节输入流和输出流
通过构造函数可以看出来,该类只能操作文件,而且还有模式,参数”r”只读”rw”
读写”rws””rwd”
DataInputStream和DataOutputStream
专门用来操作基本数据类型的流对象
操作字节数组
ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream在构造的时候,需要接收数据源,而且数据源是一个字节数组
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经封装了可变长度的字节数组。这就是数据目的地
因为这两个对象都操作的数组,并没有使用系统资源。所以不用关闭流
操作字符数组
CharArrayReader和CharArrayWriter
操作字符串
StringReader和StringWriter
字符集编码问题:
使用不同的字符集进行读写,会出现乱码
编码:字符串变成字节数组
解码:字节数组变成字符串
Stringàbyte[]
Byte[]àString
练习:
五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括姓名,三门课成绩),
输入格式:zhangsan,30,49,60计算出总成绩,并把学生的信息和计算出的总分数按高低顺序存放在磁盘文件”stud.txt”中。
思路:
1, 描述学生对象
2, 定义操作学生的工具类
思想:
1, 通过键盘录入一行数据,并将信息取出封装成学生对象
2, 将学生对象存储到集合中,因为要按成绩排序,所以用TreeSet集合
3, 将集合的信息写入到一个文件中
返回一个强行逆转比较器
Comparator<>cmp = Collection.ReverseOrder();