你可以使用Java内置的对象序列化与随机访问文件? 我的动机是我的回答这个问题 。
Answer 1:
你可以使用序列与随机访问文件,但你必须建立自己的基础设施。 有没有办法让序列化的大小,而不实际序列化。
我假设你要多个序列化对象存储在同一个文件,所以你需要做的是这样的:
- 存储序列化对象,保持流,直到年底内轨道偏移,然后在文件的结尾写的目录。 这类似于ZIP文件格式。
-要么-
- 写出大小“占位”的字节,然后序列化对象到流,再求回占位符和写入实际写入的字节数。
Answer 2:
你可以(使用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
- 五
- 10
文章来源: Object serialization and random access in java