为什么读取字节数组到一个对象会抛出java.io.StreamCorruptedException?
我有要求从远程系统读取字节流。 远程系统有自己的客户端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)
欣赏有人能帮助这里出现什么问题吗?
因为你损坏了流。 首先,您不应该将String
中的序列化数据放入。 返回byte[]
往返是有损的。 只需传递byte[]
数组。
跟着我重复一遍。 String
不是二进制数据的容器。 写出100次;-)
编辑 0x54696765是“Tige”。 您首先没有序列化的对象。 你已经有了String
。
注意如果关闭包装ObjectInputStream
,则不需要关闭ByteArrayInputStream
,因为只包装ByteArrayInputStream
,所以不需要关闭它。
上一篇: Why reading byte array to an Object throws java.io.StreamCorruptedException?