Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中可以随机访问对象吗?_Java_Object_Random Access_Objectinputstream - Fatal编程技术网

在java中可以随机访问对象吗?

在java中可以随机访问对象吗?,java,object,random-access,objectinputstream,Java,Object,Random Access,Objectinputstream,基本上我有一个字符串对象的文件。我使用Java来存储对象。是否可以随机访问对象(字符串),比如说,如果我想访问第11个对象,我可以以某种方式跳转到该位置,而不必使用第11次循环到该位置。如果我想跳回去,我也可以这样做,而不必从头再来。谢谢 正如所建议的,我想我可以通过某种方式使用skipBytes()方法来实现某种随机访问。虽然我不能保证我的对象是固定大小的,但是如果我可以在文件中保留这些对象的位置数组,我可以使用该数组作为索引,并使用skipBytes()进行随机访问。所以问题仍然存在,不管怎

基本上我有一个字符串对象的文件。我使用Java来存储对象。是否可以随机访问对象(字符串),比如说,如果我想访问第11个对象,我可以以某种方式跳转到该位置,而不必使用第11次循环到该位置。如果我想跳回去,我也可以这样做,而不必从头再来。谢谢


正如所建议的,我想我可以通过某种方式使用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()进行随机访问。所以问题仍然存在,不管怎样,当我写东西的时候,我能知道物体的大小吗?嗯。。。读取之前的文件大小和