我有些东西我不明白,请帮帮忙。
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());其产出如下:
[-84, -19, 0, 5]
buffer.length = 4
new ByteArrayInputStream(buffer).available() is: 4
input.available(): 0我很困惑,为什么一个4个有效字节的字节数组在放入ObjectInputStream后变为零。
我尝试过的事情:
所以我不知道为什么会发生这种事。
请帮帮忙,非常感谢!
发布于 2017-02-04 01:38:41
正如另一个答案所提到的,available仅意味着在发生阻塞之前可以读取的字节数。
不过,我猜想您没有遵循ObjectInputStream的规则,后者指定了An ObjectInputStream deserializes primitive data and objects previously written using an ObjectOutputStream.
换句话说,要实际使用ObjectInputStream读取数据,首先必须使用某种类型的ObjectOutputStream编写数据。下面是一个示例,用您提供的数据说明了这一点:
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,所以以上可能不是最佳实践,也不是多余的代码。)
发布于 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方法调用,请看下面的片段:
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,因为它的名称具有误导性:)
https://stackoverflow.com/questions/42035320
复制相似问题