首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectOutputStream.toByteArray返回垃圾

ObjectOutputStream.toByteArray返回垃圾
EN

Stack Overflow用户
提问于 2012-09-06 20:14:09
回答 3查看 2.2K关注 0票数 1

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

代码语言:javascript
复制
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]?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-06 20:24:23

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

代码语言:javascript
复制
objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8,9});

然后,您应该使用对称ObjectInputStream来读取:

代码语言:javascript
复制
final ObjectInputStream objectInputStream = new ObjectInputStream(
        new ByteArrayInputStream(
                byteArrayOutputStream.toByteArray()
        )
);
byte[] original = (byte[]) objectInputStream.readObject();

然而,如果您已经有了byte[],那么使用Java将其转换为字节数组是没有意义的(它已经是这样了!)直接写和读就行了:

代码语言:javascript
复制
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));
票数 2
EN

Stack Overflow用户

发布于 2012-09-06 20:17:46

ObjectOutputStream不是OutputStream,如果它做同样的事情,那么拥有它就没有多大意义了。

ObjectOutputStream用于编写对象,它有页眉(可以看到)和页脚(只有关闭流才能看到)。

票数 0
EN

Stack Overflow用户

发布于 2012-09-06 20:23:50

您没有向objectOutputStream中写入任何内容,但是ObjectOutputStream附带了一些元信息。出于您的小示例的目的,您可以使用ByteArrayOutputStream。然后需要使用byteArrayOutputStream.flush()将数据写入到流中。

代码语言:javascript
复制
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(new byte[]{1,2,3,4,5,6,7,8,9});
byteArrayOutputStream.flush();
byte[] original = byteArrayOutputStream.toByteArray(); 
System.out.println(Arrays.toString(original));

完成后,别忘了关闭这个流!

代码语言:javascript
复制
byteArrayOutputStream.close();

ObjectOutputStreams用于序列化对象。如果你想序列化对象,你应该使用ObjectOutputStream#writeObject和ObjectInputStream#readObject。

示例:http://java.sun.com/developer/technicalArticles/Programming/serialization/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12299889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档