处理流之六:对象流
ObjectInputStream和OjbectOutputSteam
用于存储和读取对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从据源中还原回来。
序列化与反序列化对针对的是对象的各种属性,不包括类的属性
序列化(Serialize):用ObjectOutputStream 类将一个Java对 象写入I0流中
反序列化(Deserialize):用ObjectlnputStream类 从I0流中恢复该Java对象
ObjectOutputStream和ObjectlnputStream不能序列化static和transient修饰的成员变量
//正是因为保存对象到硬盘(对象的持久化)和对象的网络传输,需要做这两件事就产生了对象的输入与输出流
RandomAccessFile类
RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件
支持只访问文件的部分内容
可以向已存在的文件后追加内容
RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。
RandomAccessFile类对象可以自由移动记录指针:
**long getFilePointer()😗*获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到pos位置
下面做文件的序列化与反序列化
首先创建一个Person类
import java.io.Serializable;
public class Person implements Serializable{
/*
* 一个表示序列化版本标识符的静态变量
* 用来表明类的不同版本间的兼容性
*/
private static final long serialVeersionUID = 1L;
String name;
int age;
}
对象的序列化
/*
* 对象的序列化
*/
public static void testSerialize() throws Exception {
//定义对象的输出流,把对象的序列化之后的流放到指定的文件中
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\\\eclipse Java\\\\Ti\\\\src\\\\day13\\\\tt9.txt"));
Person p = new Person();
p.name = "zhangsan";
p.age = 11;
out.writeObject(p);
out.flush();//刷写数据到硬盘
out.close();
}
对象的反序列化
/*
* 对象的反序列化
*/
public static void testDeserialize() throws Exception {
//创建对象输入流对象,从指定的文件中把对象的序列化之后的流读取出来
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\\\\\\\eclipse Java\\\\\\\\Ti\\\\\\\\src\\\\\\\\day13\\\\\\\\tt9.txt"));
Object obj = in.readObject();
Person p = (Person)obj;
/*
* 对象的序列化与反序列化使用的类要严格一致,包名类名类机构等等都要一致
* 否则出现错误
*/
// day13.test.Person p = (day13.test.Person)obj;
System.out.println(p.name);
System.out.println(p.age);
}
文件的随机读写,程序可以跳到文件的任意位置来读写文件
文件的随机读
public static void testRandomAccessFileRead() throws Exception{
//RandomAccessFile的构造有两个参数,参数1是读写文件的路径
//参数2是指定RandomAccessFile 的访问模式
//r: 只读
//rw: 读取和写入
//rwd: 读取和写入,同步文件的的更新
//rws: 读取和写入 同步文件内容和元数据的更新
//最常使用r和rw
RandomAccessFile ra = new RandomAccessFile("D:\\eclipse Java\\Ti\\src\\day13\\test10.txt","r");
ra.seek(0); // 设置读取文件内容的起始点
byte[] b = new byte[1024];
int len = 0;
while((len = ra.read(b)) != -1) {
System.out.println(new String(b, 0, len));
}
ra.close();
}
文件的随机写
public static void testRandomAccessFileWrite() throws Exception{
RandomAccessFile ra= new RandomAccessFile("D:\\eclipse Java\\Ti\\src\\day13\\test10.txt","rw");
ra.seek(0); //设置写文件内容的起始点
//写入的文件会将原来的文件覆盖
// ra.seek(ra.length()); // 追加文件设置起始点为ra.length()
ra.write("你好".getBytes());
ra.close();
}