2015-02-07 122 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);