java - ObjectOutputStream.toByteArray 返回垃圾

标签 java stream

我需要从发送到输出流的所有内容中获取字节数组。但我却得到了 4 个字节的垃圾。为什么?

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.write(new byte[]{1,2,3,4,5,6,7,8,9});
byte[] original = byteArrayOutputStream.toByteArray(); 
System.out.println(Arrays.toString(original)); // why not [1,2,3,4,5,6,7,8,9]?

最佳答案

您的代码中有几个缺陷。首先,您应该使用writeObject():

objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8,9});

那么你应该使用对称的ObjectInputStream来读取:

final ObjectInputStream objectInputStream = new ObjectInputStream(
        new ByteArrayInputStream(
                byteArrayOutputStream.toByteArray()
        )
);
byte[] original = (byte[]) objectInputStream.readObject();

但是如果您已经有一个 byte[],则使用 Java 序列化将其转换为字节数组(它已经是字节数组了!)是没有意义的,只需编写并直接阅读:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9});
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
    byteArrayOutputStream.toByteArray()
);
final byte[] original = new byte[9];
byteArrayInputStream.read(original);
System.out.println(Arrays.toString(original));

关于java - ObjectOutputStream.toByteArray 返回垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299889/

相关文章:

java - log4j2 LogManager.getLogger() 是线程安全的吗?

Java Mail API 密码验证

datetime - 如何在 Flutter 中使用 Streams 更新时间?

c++ - 如果最后一行不相等则追加

c++ - 在下一个之前检测行尾

java - HTTP 状态 405 - 在 spring mvc 中执行 return 'GET' 时不支持请求方法 "redirect:*.*"

java - 从 JBoss 使用 JAX-WS RI

java - 我正在尝试使用 GLU.gluPerspective(),但它给了我静态引用错误

http - 在 Squeak 中,一旦 block 到达,就将大 HTTP 响应的 block 写入磁盘

delphi - AnsiString 转流