序列化多个对象
再使用ObjectOutputStream后文件会自动带上一个头aced 0005(占4个字节),然后每次读取都读完头然后在读内容。导致追加数据时发生错误。解决方法就是先判断文件是否存在。如果不存在,就先创建文件。追加的情况就是当判断文件存在时,把那个4个字节的头aced 0005截取掉,然后在把对象写入到文件。这样就实现了对象序列化的追加。例如:
file = new File(CONSUME_INFO_PATH + number + ".txt");
boolean flag = file.exists();
try (FileOutputStream fos = new FileOutputStream(file, true);
ObjectOutputStream oos = new ObjectOutputStream(fos)){
if (flag){
//文件存在
long len;
len = fos.getChannel().position() -4; //去掉头aced (0005)
fos.getChannel().truncate(len);
}
oos.writeObject(consumInfo)
}
反序列化遍历一个文件中的所有对象
try (InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is)) {
//遍历所有对象,is.available() > 0代表流中还有对象
while (is.available() > 0) {
SendContent sendContent = (SendContent) ois.readObject(
}
}
ObjectOutputStream中的坑
由于每次新建一个文件A.txt,让后创建一个ObjectOutputStream对象时,A.txt会自动带上一个头.
所以不能用file.length()判断它是否为空,要不要去头.