FileInputStream的位置

FileInputStream的位置

我正在尝试对文件中的可序列化对象执行随机读取/写入操作。

我知道我可以设置FileInputStream的位置,然后在其周围包裹适当的输入流,如下所示:

InputStream file = new FileInputStream(fileName);
((FileInputStream)file).getChannel().position(pos);
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);


但是,如果以后必须再次更改FileInputStream的位置以执行另一次写操作该怎么办?

如何更改/重置BufferedInputStream,使其正常运行?我什至必须吗?

另外,我假设对此问题的任何答案也适用于“输出”方案吗?!

最佳答案

我同意EJP:如果您想要一个适用于任意类的“通用”解决方案,那么您在这里犯了个错误。

但是您的注释清楚地表明,当正确使用序列化时,已对类进行了特殊设计,以产生“大小相等的记录”。

你需要做什么:


忘记使用FileInput / OutputStream,而是:
使用RandomAccessFile-因为它允许您在文件中的随机点读取/写入字节
对于每个要处理的对象,请使用自己专用的
ByteArrayInputStream(resp。输出)对象。


换句话说:为了使这项工作有效,您一次只能读取/写入多个对象。您希望序列化是一种将单个对象转换为字节流的简单机制。反之亦然。

但是请记住:在非常有限的用例中,您将花费大量精力。一旦您的类需要变得更加复杂,就会很麻烦-因为您现在最终得到了不同大小的字节表示形式。

所以这里是真正的答案:虽然您的想法可以实现(并且是有关序列化和文件访问的不错的学习练习),但您还是在这里重新发明轮子!而且您的车轮版本非常受限制,难以增强;并可能导致性能不佳。

因此,如果这是针对“真实”产品的,则:最好转向任何真实数据库,而不是构建自己的DBMS。

07-25 22:52