在java中可以随机访问对象吗?
基本上我有一个字符串对象的文件。我使用Java来存储对象。是否可以随机访问对象(字符串),比如说,如果我想访问第11个对象,我可以以某种方式跳转到该位置,而不必使用第11次循环到该位置。如果我想跳回去,我也可以这样做,而不必从头再来。谢谢在java中可以随机访问对象吗?,java,object,random-access,objectinputstream,Java,Object,Random Access,Objectinputstream,基本上我有一个字符串对象的文件。我使用Java来存储对象。是否可以随机访问对象(字符串),比如说,如果我想访问第11个对象,我可以以某种方式跳转到该位置,而不必使用第11次循环到该位置。如果我想跳回去,我也可以这样做,而不必从头再来。谢谢 正如所建议的,我想我可以通过某种方式使用skipBytes()方法来实现某种随机访问。虽然我不能保证我的对象是固定大小的,但是如果我可以在文件中保留这些对象的位置数组,我可以使用该数组作为索引,并使用skipBytes()进行随机访问。所以问题仍然存在,不管怎
正如所建议的,我想我可以通过某种方式使用skipBytes()方法来实现某种随机访问。虽然我不能保证我的对象是固定大小的,但是如果我可以在文件中保留这些对象的位置数组,我可以使用该数组作为索引,并使用skipBytes()进行随机访问。所以问题仍然存在,不管怎样,当我实际编写对象时,我可以知道对象的大小,以便以某种方式记录位置?唯一的方法是将对象分别存储在它们自己的流中,或者存储在同一个文件中,或者存储在不同的文件中
最简单的方法可能是将对象存储在一个列表中,然后一次读取该列表,然后随机访问该列表。唯一的方法是将对象分别存储在它们自己的流中,或者存储在同一个文件中,或者存储在不同的文件中
最简单的方法可能是将对象存储在一个列表中,然后一次读取该列表,然后随机访问该列表。这在
ObjectInputStream
中是不可能的,如果需要随机访问,则需要先将所有对象读入支持随机访问的集合/数组。这在ObjectInputStream
中是不可能的,如果需要随机访问,则需要先将所有对象读入支持随机访问的集合/数组。ObjectOutputStream本身无法做到这一点,因为首先它无法知道该文件中对象的大小;实际上,它甚至不知道对象是同一类型的
如果您确实知道对象的大小是固定的,并且您知道该大小,那么可以使用skipBytes()
方法——但我强烈怀疑您是否真的知道这一点
编辑:
感谢您接受我的回答,但是(请澄清):鉴于您提到的要求,我的意图是展示一种可以做到这一点的方法,但在我看来,这根本不是应该做到的方式。:) ObjectOutputStream本身无法做到这一点,因为首先它无法知道该文件中对象的大小;实际上,它甚至不知道对象是同一类型的 如果您确实知道对象的大小是固定的,并且您知道该大小,那么可以使用
skipBytes()
方法——但我强烈怀疑您是否真的知道这一点
编辑:
感谢您接受我的回答,但是(请澄清):鉴于您提到的要求,我的意图是展示一种可以做到这一点的方法,但在我看来,这根本不是应该做到的方式。:) 使用
ObjectOutputStream
存储字符串对象完全是过火了。您已经考虑过使用起始位置索引。那么,为什么不使用FileOutputStream
将字符串直接存储到文件中呢?或者使用固定长度编码(其中字节数==字符串长度,可能是*2)将其包装在OutputStringWriter
中,或者使用toBytes(编码)
分别存储每个字符串,并注意结果字节数组的长度。使用ObjectOutputStream
存储字符串对象完全是矫枉过正。您已经考虑过使用起始位置索引。那么,为什么不使用FileOutputStream
将字符串直接存储到文件中呢?或者使用固定长度编码(其中字节数==字符串长度,可能是*2)将其包装在OutputStringWriter
中,或者使用toBytes(编码)
分别对每个字符串执行,并注意结果字节数组的长度。不,您不能,至少不是所有情况下都可以,因为对象可以包含对以前序列化对象的反向引用。这就是我所说的“如果您确实知道”的意思——例如,如果您只存储整数对象。我还认为这只是一个丑陋的黑客行为,但这是在读取序列化对象时实际上可以跳过某些内容的唯一方法。为了澄清这一点,我在编辑中表达了我的怀疑。我想我可以以某种方式做到这一点,唯一的问题是我不能保证我的对象是固定大小的,但是如果我在数组中保留一个位置数组,我可以将该数组用作索引并使用skipBytes()进行随机访问。所以问题仍然存在,不管怎样,当我写东西的时候,我能知道物体的大小吗?嗯。。。读取刷新前后的文件大小,可能是?:)。比如start=readCurrentSize();write();end=readCurrentSize()代码>。真的,我认为你不需要这样的黑客。为什么不选择单独的文件呢?我将尝试两种方法,看看哪一种效果更好,谢谢。不,你不能,至少不是所有情况下都可以,因为对象可以包含对以前序列化对象的反向引用。这就是我所说的“如果你确实知道”的意思——例如,如果你只存储整数对象。我还认为这只是一个丑陋的黑客行为,但这是在读取序列化对象时实际上可以跳过某些内容的唯一方法。为了澄清这一点,我在编辑中表达了我的怀疑。我想我可以以某种方式做到这一点,唯一的问题是我不能保证我的对象是固定大小的,但是如果我在数组中保留一个位置数组,我可以将该数组用作索引并使用skipBytes()进行随机访问。所以问题仍然存在,不管怎样,当我写东西的时候,我能知道物体的大小吗?嗯。。。读取之前的文件大小和