Java从文件中读取两种不同类型的对象

Java从文件中读取两种不同类型的对象,java,Java,在我的文件中,我已将hashmap保存在头文件中,我可以成功读取该头文件,但当我尝试读取以下字节时,出现错误: java.io.StreamCorruptedException: invalid type code: C9 at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Unknown Source) 这是我的密码: FileInputStream fis = new FileInputStre

在我的文件中,我已将hashmap保存在头文件中,我可以成功读取该头文件,但当我尝试读取以下字节时,出现错误:

java.io.StreamCorruptedException: invalid type code: C9
    at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Unknown Source)
这是我的密码:

    FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream ois = new ObjectInputStream(fis);

    try {
        map = (HashMap<Integer, String>) ois.readObject();

        byte b = ois.readByte();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
FileInputStream fis=新的FileInputStream(文件名);
ObjectInputStream ois=新ObjectInputStream(fis);
试一试{
map=(HashMap)ois.readObject();
字节b=ois.readByte();
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
我如何写作:

        FileOutputStream os = new FileOutputStream(fileOutPath);
        ObjectOutputStream oos = new ObjectOutputStream(os);

        oos.writeObject(codePathMap);

        BitSet buffer = new BitSet();

        for (int i = 0; i < file.length; i++) {
            for (int y = 0; y < codePathMap.get(i).length(); i++) {
                if (codePathMap.get(b).charAt(i) == '1') {
                    buffer.set(bitIndex);
                }
            }
        }
        os.write(buffer.toByteArray());
FileOutputStream os=新的FileOutputStream(fileOutPath);
ObjectOutputStream oos=新的ObjectOutputStream(os);
oos.writeObject(codePathMap);
位集缓冲区=新位集();
for(int i=0;i
写入和读取算法之间存在不匹配。 简而言之,您正在使用
FileOutputStream
写入
byte[]
,但
ObjectInputStream
是为了读取它。这些类使用不同的方式处理存储的数据

因此,您应该始终使用
ObjectOutputStream/ObjectInputStream

因此,只需修复错误,而不是使用
FileOutputStream

os.write(buffer.toByteArray());
您可以使用
ObjectOutputStream(oos)
字节[]
写为:

oos.write(buffer.toByteArray());

旁注:
无效类型代码:C9
,C9是写入的
字节[]
的实际值,因此
C9
201
,它
ObjectInputStream
解释为Java类型(这就是
ObjectOutputStream
序列化数据的方式。

写入和读取算法之间存在不匹配。 简而言之,您使用
FileOutputStream
写入
byte[]
,但是
ObjectInputStream
读取它。这些类使用不同的方式来处理存储的数据

因此,您应该始终使用
ObjectOutputStream/ObjectInputStream

因此,只需修复错误,而不是使用
FileOutputStream

os.write(buffer.toByteArray());
您可以使用
ObjectOutputStream(oos)
字节[]
写为:

oos.write(buffer.toByteArray());

旁注:
无效类型代码:C9
,C9是写入的
字节[]
的实际值,因此
C9
201
,它
ObjectInputStream
解释为Java类型(<代码> ObjutOutsStudio序列化数据)。请考虑文件的内容到您的问题。它是BythWess中的压缩文件,您编写对象的代码将是很好看到的。BTH HMAP在迭代时不保证特定的顺序。您编写文件的代码是很重要的。F是一个“压缩文件,以字节为单位”,代码在哪里解压?而且,与上面的建议相反,实际文件内容是不感兴趣的,至少除非你在十六进制中提供它。我还添加了如何写入文件。请考虑文件的内容到你的问题。它是BythWELL中的压缩文件,是编写对象的代码。很高兴看到。顺便说一句,HashMap保证在迭代时没有特定的顺序。您编写文件的代码非常重要。如果它是“字节压缩文件”,解压缩它的代码在哪里?而且,与上面的建议相反,实际的文件内容不感兴趣,至少除非您以十六进制提供它。我补充了如何我写文件他真的应该在字节数组上使用
writeObject()
,否则他除了读到文件的末尾,把
byte
集合中的字节列在一起,然后把这个集合变成
byte[]
。非常费劲。一个
readObject()
会更好。实际上,他可以安全地使用ObjectOutputStream#write(字节[]),然后使用ObjectOutputStream#readByte()为了得到一个字节的值,但我同意你的观点-把这留给代码作者。我没有意识到只读取一个字节的意义。对我来说,这似乎是另一个协议错误。他真的应该使用
writeObject()
在字节数组上,否则他就没有真正的方法读回它,只能读取到文件的末尾,将
字节的集合中的字节进行collection,然后将该集合转换为
字节[]
。非常费力。一个
readObject()
会更好。实际上,他可以安全地使用ObjectOutputStream#write(byte[]),然后使用ObjectInputStream#readByte(),以获得一个字节值,但我同意你的观点——将这一点留给代码作者。我无法理解只读取一个字节的观点。对我来说,这似乎是另一个协议错误。