您可以将Java的内置对象序列化与随机访问文件一起使用吗?我的动机是我对这个问题的回答。
可以将序列化与随机访问文件一起使用,但必须自己构建基础结构。如果不实际序列化,就无法获取序列化的大小。
我假设你想在同一文件中存储多个序列化对象,所以你需要做这样的事情:
- 存储序列化的对象,跟踪流中的偏移量直到结束,然后在文件末尾写入目录。这类似于 zip 文件格式。
-或-
- 为大小写入"占位符"字节,
- 然后将对象序列化为流,然后查找回占位符并写入实际写入的字节数。
你可以(使用java的ByteArrayOutputStream和ByteArrayInputStream),但这是一个非常糟糕的主意。Java的内置对象序列化不是无记忆的。"必须从相应的 ObjectInputstream 中读回对象,其类型和顺序与写入时相同。您可以通过为您写入/读取的每个对象创建一个新的 ObjectOutputStream/ObjectInputStream 实例来解决此问题,但这会使您的文件过大。
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(1);
System.out.println(byteArrayOutputStream.size());
byteArrayOutputStream.reset();
objectOutputStream.writeObject(2);
System.out.println(byteArrayOutputStream.size());
byteArrayOutputStream.reset();
objectOutputStream.writeObject(2);
System.out.println(byteArrayOutputStream.size());
byteArrayOutputStream.reset();
objectOutputStream.writeObject(3);
System.out.println(byteArrayOutputStream.size());
byteArrayOutputStream.reset();
objectOutputStream.close();
}
}
输出
- 81
- 10
- 5
- 10