【问题标题】:ObjectInputStream.read(byte[], int, int) missing data?ObjectInputStream.read(byte[], int, int) 缺少数据?
【发布时间】:2012-05-04 04:33:37
【问题描述】:

我正在尝试序列化/反序列化位图。 android how to save a bitmap - buggy code 的答案非常有帮助。但是,当我去读取我的数组时:

private void readObject(ObjectInputStream in) throws IOException,
    ClassNotFoundException {
  int rowBytes = in.readInt();
  int height = in.readInt();
  int width = in.readInt();
  int bmSize = rowBytes * height;    // Ends up being 398208

  ByteBuffer byteBuffer = ByteBuffer.allocate(bmSize);
  int bytesRead = in.read(byteBuffer.array(), 0, bmSize);
  // Use array to create bitmap here
}

它正在读取 1008 个字节,而不是我写的 398208 个字节。我已经用循环替换了调用,效果很好:

for (int i = 0; i < bmSize; i++) {
  byteBuffer.array()[i] = in.readByte();
}

可能出了什么问题?不抛出异常。 ObjectInputStream.read(byte[], int, int) 的文档表明它应该提前返回的唯一原因是它是否到达了流的末尾,这显然不是因为我的解决方法没有引发任何异常。

【问题讨论】:

  • 如果它工作正常,你为什么不使用循环。它不需要一次读取所有数据
  • 循环工作正常,我只是想知道为什么内置方法不起作用。另外我怀疑适当的方法会更快 - 它可能能够使用本机调用等。

标签: java android serialization


【解决方案1】:

文档有误。 ObjectInputStream 只是调用 inputStream 来读取字节。如果您希望它在读取数据之前一直阻塞,请使用 readFully。

【讨论】:

  • +1。谷歌文档不仅错误而且毫无意义。它说它会阻塞,直到读取了count 字节而不定义count。 Java Javadoc 是正确的。
  • 非常(非常)感谢!我已经在android-review.googlesource.com/#/c/36320 发布了更新的文档。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多