首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByteArrayInputStream到ObjectInputStream消失了

ByteArrayInputStream到ObjectInputStream消失了
EN

Stack Overflow用户
提问于 2017-02-04 00:55:35
回答 2查看 3.6K关注 0票数 2

我有些东西我不明白,请帮帮忙。

代码语言:javascript
复制
System.out.println("\n" + Arrays.toString(buffer) + "\n");
System.out.println("buffer.length = " + buffer.length + "\nnew ByteArrayInputStream(buffer).available() is: " + new ByteArrayInputStream(buffer).available());
ObjectInput input = new ObjectInputStream(new ByteArrayInputStream(buffer));
System.out.println("input.available(): " + input.available());

其产出如下:

代码语言:javascript
复制
[-84, -19, 0, 5]

buffer.length = 4
new ByteArrayInputStream(buffer).available() is: 4
input.available(): 0

我很困惑,为什么一个4个有效字节的字节数组在放入ObjectInputStream后变为零。

我尝试过的事情:

  1. 起初,我怀疑我的字节数组是空的,但是正如您所看到的,我打印出来了,它的长度是4。
  2. 然后我想我的字节可能是无效的,所以我打印出了每个字节,正如您所看到的,这四个字节都是有效的。

所以我不知道为什么会发生这种事。

请帮帮忙,非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-04 01:38:41

正如另一个答案所提到的,available仅意味着在发生阻塞之前可以读取的字节数。

不过,我猜想您没有遵循ObjectInputStream的规则,后者指定了An ObjectInputStream deserializes primitive data and objects previously written using an ObjectOutputStream.

换句话说,要实际使用ObjectInputStream读取数据,首先必须使用某种类型的ObjectOutputStream编写数据。下面是一个示例,用您提供的数据说明了这一点:

代码语言:javascript
复制
byte[] buffer = new byte[]{-84,-19,0,5};
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream= new ObjectOutputStream(out);
objectOutputStream.write(buffer);
objectOutputStream.flush();

ObjectInput input = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
System.out.println("input.available(): " + input.available());
System.out.println("input.readByte(): " + input.readByte());

(我要补充的是,我很少使用Java中的IO,所以以上可能不是最佳实践,也不是多余的代码。)

票数 5
EN

Stack Overflow用户

发布于 2017-02-04 01:25:59

这里available方法的javadoc,它是这样说的:

返回可以在不阻塞的情况下读取的字节数。

因此,它不返回数组/ read中存在的bytes总数,而是返回在被阻塞之前可以读取的bytes数。因此,返回0是一个有效的方案。

现在,让我们看看ObjectInputStream的javadoc,下面是简短的解释:

超出分配数据结束的非对象读取将以指示流结束的方式反映数据的结束:按字节读取或读取字节数返回-1,而原始读取将抛出EOFExceptions。如果没有相应的writeObject方法,则默认序列化数据的结束标志着分配的数据的结束。

在代码中要做的是对原始数据进行read (或没有WriteObject方法的读取),因为它不是有效数据(对于ObjectInputStream),read总是返回-1。我只需调用EOFException方法就可以复制readObject

然后,我尝试编写/读取一个新对象,并测试了available方法调用,请看下面的片段:

代码语言:javascript
复制
byte[] buffer = new byte[]{-84, -19, 0, 5};
System.out.println("\n" + Arrays.toString(buffer) + "\n");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer);
System.out.println("buffer.length = " + buffer.length + "\nnew ByteArrayInputStream(buffer).available() is: " + new ByteArrayInputStream(buffer).available());
ObjectInputStream input = new ObjectInputStream(byteArrayInputStream);
System.out.println("input.available(): " + input.available());
//      System.out.println(input.readObject()); //Uncomment to see EOFException

Date date = new Date();
System.out.println(date);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteArrayOut);
out.writeObject(date);
byte[] bytes = byteArrayOut.toByteArray();

input = new ObjectInputStream(new ByteArrayInputStream(bytes));
System.out.println(input.available());
System.out.println(input.readObject());

代码reads已经写入的对象并打印值。请注意,即使正确读取对象并打印相同的对象,available方法仍然返回0。因此,我想重新评论一下,不要太依赖available,因为它的名称具有误导性:)

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

https://stackoverflow.com/questions/42035320

复制
相关文章

相似问题

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