android bytebuffer as intbuffer - asarray总是提供unsupportedoperationexception

时间:2011-10-04 23:49:59

标签: java android bytebuffer

我正在尝试获取一组mipmaplevels并保存到本地缓存文件,以避免每次都重建它们(预生成它们是不切实际的......)

我已经将mipmaplevels放入一组位图中了,现在想把它们写到我的缓存文件中,但是我使用的各种缓冲区(直接与否,设置字节顺序或不设置)hasArray总是返回false intbuffer。我必须在这里做些傻事,但我再也看不到树木了。

没有长时间使用java,所以这是一个noob错误;)

代码如下所示:

  int tsize = 256;
  ByteBuffer xbb = ByteBuffer.allocate(tsize*tsize*4);
  // or any other variety of create like wrap etc. makes no diference
  xbb.order(ByteOrder.nativeOrder()); // in or out - makes no difference
  IntBuffer ib = xbb.asIntBuffer();
  for (int i = 0; i < tbm.length; i++) {
    //ib.array() throws exception, ib.hasArray() returns false;
    tbm[i].getPixels(ib.array(), 0, tsize, 0, 0, tsize, tsize);
    ou.write(xbb.array(), 0, tsize*tsize*4);
    tsize = tsize / 2;
  }

2 个答案:

答案 0 :(得分:1)

this link - 它谈到同样的问题。那里有答案;但最后得出结论:

In another post
http://forum.java.sun.com/thread.jsp?forum=4&thread=437539
it is suggested to implement a version of DataBuffer which is
backed by a (Mapped)ByteBuffer *gasp* ...

请注意,forum.java.sun.com已移至Oracle某处。 我希望这有帮助。无论如何,如果你找到更好的答案也让我知道: - )

答案 1 :(得分:1)

在我的测试中,使用ByteBufferIntBuffer更改为ByteBuffer.asIntBuffer()会导致您丢失支持数组。

如果您使用IntBuffer.allocate(tsize*tsize),则应该能够获得支持数组。

ByteBuffer buf = ByteBuffer.allocate(10);
IntBuffer ib = buf.asIntBuffer();
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());

buf = ByteBuffer.allocateDirect(10);
ib = IntBuffer.allocate(10);
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());

产地:

Buf java.nio.ByteBufferAsIntBufferB[pos=0 lim=2 cap=2], buf.hasArray: true, ib.hasArray false
Buf java.nio.HeapIntBuffer[pos=0 lim=10 cap=10], buf.hasArray: false, ib.hasArray true