如何在更改基础FileInputStream的位置后重置BufferedInputStream

时间:2017-04-25 02:16:10

标签: java serialization inputstream java-io

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

我知道我可以设置InputStream file = new FileInputStream(fileName); ((FileInputStream)file).getChannel().position(pos); InputStream buffer = new BufferedInputStream(file); ObjectInput input = new ObjectInputStream (buffer); 的位置,然后将相应的输入流包裹起来,如下所示:

FileInputStream

但是如果我必须稍后再次更改BufferedInputStream的位置以执行另一次写操作呢?

如何更改/重置import pandas as pd import matplotlib.pyplot as plt import numpy as np s = pd.Series( [8, 24, 21, 23, 24], index = ["Your Plan", "Benchmark", "Region", "Industry", "Size"] ) plt.plot(s.values) ax = plt.gca() ax.set_ylim(np.min(s),np.max(s)) plt.show() 以便它可以正常运行?我还需要吗?

另外,我假设这个问题的任何答案也适用于输出方案?!

3 个答案:

答案 0 :(得分:1)

我认为你可以做的更容易就是在FileInputStream移动位置的任何时候创建一个新的"Child process 3\n"

答案 1 :(得分:1)

  

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

在那里停下来(然后回去)。你不能通过任何方式这样做。对象流依赖于其自己的过去历史,通过“句柄”系统,对于类和对象。您通常不会在此成功,但是您尝试在代码中实现它,例如,通过消除缓冲流。

编辑序列化不会重新序列化已经序列化的对象。例如,StreamClassDesc,随每个对象提供。相反,它只是序列化一个'句柄'。因此,即使您只序列化两个Strings,也无法自行反序列化第二个,因为classdesc句柄引用了流中的先前对象。请参阅对象序列化规范。还有要考虑的流标题。

答案 2 :(得分:1)

我同意EJP:如果您要求一个适用于任意类别的“通用”解决方案,那么您将在这里找错错误的兔子洞。

但是您的评论清楚地表明,在使用序列化正确时,您专门设计了您的班级以产生“同等大小的记录”。

您需要做什么:

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

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

但请记住:在非常有限的用例中,您将花费大量精力。一旦你的课程需要更复杂,你就破解 - 因为你现在最终得到不同的大小的字节表示。

所以真正的答案在这里:虽然你的想法可以实现(并且是一个关于序列化和文件访问的一个很好的学习练习),你在这里重新发明轮子!你的那个轮子的版本非常有限,难以提升;并可能导致平庸的表现。

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