我正在尝试对文件中的可序列化对象执行随机读/写操作。
我知道我可以设置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()
以便它可以正常运行?我还需要吗?
另外,我假设这个问题的任何答案也适用于输出方案?!
答案 0 :(得分:1)
我认为你可以做的更容易就是在FileInputStream
移动位置的任何时候创建一个新的"Child process 3\n"
。
答案 1 :(得分:1)
我正在尝试对文件中的可序列化对象执行随机读/写操作。
在那里停下来(然后回去)。你不能通过任何方式这样做。对象流依赖于其自己的过去历史,通过“句柄”系统,对于类和对象。您通常不会在此成功,但是您尝试在代码中实现它,例如,通过消除缓冲流。
编辑序列化不会重新序列化已经序列化的对象。例如,StreamClassDesc
,随每个对象提供。相反,它只是序列化一个'句柄'。因此,即使您只序列化两个Strings
,也无法自行反序列化第二个,因为classdesc句柄引用了流中的先前对象。请参阅对象序列化规范。还有要考虑的流标题。
答案 2 :(得分:1)
我同意EJP:如果您要求一个适用于任意类别的“通用”解决方案,那么您将在这里找错错误的兔子洞。
但是您的评论清楚地表明,在使用序列化正确时,您专门设计了您的班级以产生“同等大小的记录”。
您需要做什么:
换句话说:为了使这项工作,您不能一次读/写多个对象。您希望序列化是将单个对象转换为字节流的简单机制;反之亦然。
但请记住:在非常有限的用例中,您将花费大量精力。一旦你的课程需要更复杂,你就破解 - 因为你现在最终得到不同的大小的字节表示。
所以真正的答案在这里:虽然你的想法可以实现(并且是一个关于序列化和文件访问的一个很好的学习练习),你在这里重新发明轮子!你的那个轮子的版本非常有限,难以提升;并可能导致平庸的表现。
因此,如果这是针对“真正的”产品:更好地转向任何真正的数据库,而不是构建自己的DBMS。