我需要从远程系统读取字节流 . 远程系统有自己的客户端API来读取字节 . 但在我的结尾,我必须将字节数组转换为POJO . 在这样做的同时,我收到了错误 java.io.StreamCorruptedException: invalid stream header:
.
为了测试功能,我编写了以下程序将 String
转换为 byte array
,然后将字节数组转换为 Object
.
public class ByteToObject {
public static void main(String[] args) {
try {
final String str = "Tiger";
System.out.println("\nByte array for string '" + str + "' --> \n" + Arrays.toString(getByteArray(str)));
System.out.println("Object read --> " + getObject(getByteArray(str)));
} catch (Exception e) {
e.printStackTrace();
}
}
private static byte[] getByteArray(final String str) throws Exception {
return str.getBytes(CharEncoding.UTF_8);
}
private static Object getObject(final byte[] byteArray) throws Exception {
InputStream byteArrayStream = null;
ObjectInputStream inputStream = null;
try {
byteArrayStream = new ByteArrayInputStream(byteArray);
inputStream = new ObjectInputStream(byteArrayStream);
return inputStream.readObject();
} finally {
if(null != byteArrayStream) {
byteArrayStream.close();
}
if(null != inputStream) {
inputStream.close();
}
}
}
}
输出是:
Byte array for string 'Tiger' -->
[84, 105, 103, 101, 114]
java.io.StreamCorruptedException: invalid stream header: 54696765
Object read --> null
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.(ObjectInputStream.java:299)
at com.demo.serialize.ByteToObject.getObject(ByteToObject.java:41)
at com.demo.serialize.ByteToObject.main(ByteToObject.java:24)
感谢有人可以帮助解决这里的错误吗?
1 回答
因为你损坏了流 . 您不应该首先在
String
中拥有序列化数据 . 往返byte[]
的往返是有损的 . 只需传递byte[]
数组即可 .在我之后重复 .
String
不是二进制数据的容器 . 写出100次;-)EDIT 0x54696765是"Tige" . 您首先没有序列化对象 . 你已经拥有了
String
.注意如果要关闭包装
ObjectInputStream
,则不需要关闭ByteArrayInputStream
,因为只包装ByteArrayInputStream
,您也不需要关闭它 .