Java从文件中读取两种不同类型的对象
在我的文件中,我已将hashmap保存在头文件中,我可以成功读取该头文件,但当我尝试读取以下字节时,出现错误:Java从文件中读取两种不同类型的对象,java,Java,在我的文件中,我已将hashmap保存在头文件中,我可以成功读取该头文件,但当我尝试读取以下字节时,出现错误: java.io.StreamCorruptedException: invalid type code: C9 at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Unknown Source) 这是我的密码: FileInputStream fis = new FileInputStre
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(),以获得一个字节值,但我同意你的观点——将这一点留给代码作者。我无法理解只读取一个字节的观点。对我来说,这似乎是另一个协议错误。