在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的库。感谢
答案 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);