Java 使用ObjectInputStream读取时跳过对象失败

Java 使用ObjectInputStream读取时跳过对象失败,java,fileinputstream,objectinputstream,Java,Fileinputstream,Objectinputstream,我正在写一个程序来序列化对象列表。首先,我序列化一个整数,它表示写入的对象数。然后我一个接一个地序列化对象。每次我向文件写入内容后,我都会打印到目前为止写入的字节数 示例:4(第一个int)、148(int+object1)、163(int+object1+object2)、180266291306356 我希望能够在使用偏移量时读取某个对象 我尝试在读取int后跳过144个字节以到达第二个对象,例如使用skip of FileInputStream跳过字节但无法读取对象 例外情况: java.

我正在写一个程序来序列化对象列表。首先,我序列化一个整数,它表示写入的对象数。然后我一个接一个地序列化对象。每次我向文件写入内容后,我都会打印到目前为止写入的字节数

示例:4(第一个int)、148(int+object1)、163(int+object1+object2)、180266291306356

我希望能够在使用偏移量时读取某个对象

我尝试在读取int后跳过144个字节以到达第二个对象,例如使用skip of FileInputStream跳过字节但无法读取对象

例外情况:

java.io.StreamCorruptedException: invalid type code: 00
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at webdata.IndexReader.<init>(IndexReader.java:36)
at webdata.Main.main(Main.java:9)
java.io.StreamCorruptedException:无效类型代码:00
位于java.io.ObjectInputStream.readObject0(未知源)
位于java.io.ObjectInputStream.readObject(未知源)
在webdata.IndexReader.(IndexReader.java:36)
位于webdata.Main.Main(Main.java:9)
我还尝试使用ObjectInputStream的skipBytes跳过,但它返回0(意味着它跳过0字节),因此它返回第一个对象

作者:

            fOutStream = new MyFileOutputStream(System.getProperty("user.dir") + "/invertedindex.ser");
            oOutsStream = new ObjectOutputStream(fOutStream);
            oOutsStream.writeInt(invIdxArr.size());
            for(int i = 0; i < invIdxArr.size(); i++){
                System.out.println(fOutStream.getByteCount());
                oOutsStream.writeObject(invIdxArr.get(i));

            }
            oOutsStream.close();
            fOutStream.close();
fOutStream=newmyfileoutputstream(System.getProperty(“user.dir”)+“/invertedindex.ser”);
oOutsStream=新对象输出流(fOutStream);
oOutsStream.writeInt(invIdxArr.size());
对于(int i=0;i
读者:

        fInStream = new FileInputStream(System.getProperty("user.dir") + "/invertedindex.ser");
        oInStream = new ObjectInputStream(fInStream);
        int size = oInStream.readInt();
        ArrayList<InvertedIndex> invIdxArr = new ArrayList<InvertedIndex>();
        long ll= fInStream.skip(144);
        System.out.println(ll);
        invIdxArr.add(new InvertedIndex((InvertedIndex)oInStream.readObject()));
        System.out.println("freq: " + invIdxArr.get(0).getFreq() + ", postingList: " + invIdxArr.get(0).getPostingList());
        oInStream.close();
        fInStream.close();
fInStream=newfileinputstream(System.getProperty(“user.dir”)+“/inversedindex.ser”);
oInStream=新的ObjectInputStream(fInStream);
int size=oInStream.readInt();
ArrayList invIdxArr=新的ArrayList();
long ll=fInStream.skip(144);
系统输出打印项次(ll);
invIdxArr.add(新的InvertedIndex((InvertedIndex)oInStream.readObject());
System.out.println(“freq:+invIdxArr.get(0.getFreq()+”,postingList:+invIdxArr.get(0.getPostingList());
oInStream.close();
fInStream.close();
另外,如果有一种不同的方法从序列化文件中读取单个对象,我们将非常有帮助


谢谢

写入时,您可以调用
reset
然后调用
flush
,然后您可以查找到该点(在flush之后)IIRC。您不能跳过对象流中的字节/对象。对象的构建方式取决于它之前的信息。您可以编写多个ObjectOutputStreams,每个对象一个,之前有一个允许您跳过每条消息的大小,或者您可以使用自己设计的固定宽度格式,允许您随机访问。您可以在编写时调用
reset
然后调用
flush
,然后可以搜索到该点(在flush之后),IIRC。不能跳过对象流中的字节/对象。对象的构建方式取决于它之前的信息。您可以编写多个ObjectOutputStreams,每个对象一个,在它之前有一个允许您跳过每条消息的大小,或者您可以使用自己设计的固定宽度格式,允许您随机访问。