为什么将字节数组读取到Object会抛出java.io.StreamCorruptedException?

时间:2014-04-15 05:03:20

标签: java

我需要从远程系统读取字节流。远程系统有自己的客户端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 个答案:

答案 0 :(得分:4)

因为您损坏了流。您不应该首先在String中拥有序列化数据。往返byte[]的回程是有损的。只需传递byte[]数组。

在我之后重复。 String不是二进制数据的容器。写出100次; - )

编辑 0x54696765是" Tige"。你首先没有序列化对象。您已经拥有String

注意:如果您要关闭包裹ByteArrayInputStream,则不需要关闭ObjectInputStream,因为只包裹ByteArrayInputStream您真的不需要关闭那个。