2015-02-07 51 views
0
上失败

在Android Ice Cream Sandwitch和Jelly Bean中的ByteBuffer实现中存在奇怪的行为。事情是,get方法抛出BufferUnderflowException。它不在Froyo,GingerBread,Kitkat和Lollipop。ByteBuffer.get(byte [],int,int)在Android ICS和JB

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的库。谢谢

+0

根据http://developer.android.com/reference/java/nio/ByteBuffer.html#get(字节[] ,int,int)异常是当'byteCount> remaining()'' – tofi9 2015-02-07 05:01:51

+0

时的预期行为它回答为什么问题不会发生在GingerBread和Froyo? – sancho21 2015-02-07 05:11:47

+0

不,它不需要。我的观点是,你的代码首先是错误的。如果你的代码没有按照规范行事,你就不会说错误。当byteBuffer的可用字节少于3个字节时,你的代码如何知道有多少字节实际上被复制到'tagIdentifier'中? – tofi9 2015-02-07 05:16:52

回答

0

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

所以,为了防止这个bug,不要使用这个类。

使用此:

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

相反的:

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