Android ICS和JB上的ByteBuffer.get(byte [],int,int)失败

时间:2015-02-07 04:53:17

标签: android

在Android Ice Cream Sandwitch和Jelly Bean的ByteBuffer实现中有一些奇怪的行为。问题是,get方法抛出BufferUnderflowException。它不在Froyo,GingerBread,Kitkat和Lollipop。

    printAndRewind(byteBuffer);
    printAndRewind(byteBuffer);
    try {
        byteBuffer.get(tagIdentifier, 0, 3);
    } catch (BufferUnderflowException e) {
        logger.info("This will be printed in ICS & JB " + e);
        byteBuffer.rewind();
    } 

这是printAndRewind方法:

private void printAndRewind(ByteBuffer byteBuffer) {
    StringBuilder builder = new StringBuilder();
    while (byteBuffer.hasRemaining()) {
        builder.append(", ").append(byteBuffer.get());
    }
    logger.info(builder.toString());
    byteBuffer.rewind();
}

是虫子吗?如果是,那么如何克服这个问题呢?我有一个很大程度上依赖于ByteBuffer的库。感谢

1 个答案:

答案 0 :(得分:0)

我相信java.nio.MappedByteBufferAdapter类中存在错误,它是java.nio.ByteBuffer的一种实现,只发生在ICS和JB中。也许,它也适用于Honeycomb。

因此,为了防止该错误,请不要使用此类。

使用此:

byteBuf =  ByteBuffer.allocate(startByte);
channel.read(byteBuf, 0);

而不是:

inStream = new FileInputStream(file);
channel = inStream.getChannel();
byteBuf = channel.map(FileChannel.MapMode.READ_ONLY, 0, startByte);