2012-07-04 23 views
0

我與協議緩衝區工作,如果想知道:協議緩衝區被優化爲使用java nio作爲文件IO嗎?

mergeDelimitedFrom(FileInputStream fis) 

方法進行了優化,用java NIO?我真的不想去src找出...但也許我會。我覺得它應該或可以選擇使用兩者。我猜測事實並非如此。如果它不 - 我想你必須自己解析字節並手動處理分隔符,如果你想要nio?

不超與現在的NIO API的信心,但你不只要致電:

getChannel() 

上的FileInputStream使用NIO,所以假設因爲一個FileInputStream提供給mergeDelimitedFrom方法NIO可以使用?

相關職位,但更針對網絡IO:

Using Google Protocol Buffers with Java NIO?

+2

*「我真的不想去src找出」* - 似乎有點懶惰。 : - \ –

+1

是的,想要在谷歌搜索結果的答案。 –

+0

@GregKopff也希望煽動一些討論,如果其他人也想這樣做,也就是pb中的nio支持。 –

回答

-1

我想這個代碼是不是生成的代碼的一部分,但我想這是...

MergeDelimitedFrom調用CodedInputStream .readRawVarint32如下:

public static int readRawVarint32(
    final int firstByte, final InputStream input) throws IOException { 
if ((firstByte & 0x80) == 0) { 
    return firstByte; 
} 

int result = firstByte & 0x7f; 
int offset = 7; 
for (; offset < 32; offset += 7) { 
    final int b = input.read(); 
    if (b == -1) { 
    throw InvalidProtocolBufferException.truncatedMessage(); 
    } 
    result |= (b & 0x7f) << offset; 
    if ((b & 0x80) == 0) { 
    return result; 
    } 
} 
// Keep reading up to 64 bits. 
for (; offset < 64; offset += 7) { 
    final int b = input.read(); 
    if (b == -1) { 
    throw InvalidProtocolBufferException.truncatedMessage(); 
    } 
    if ((b & 0x80) == 0) { 
    return result; 
    } 
} 
throw InvalidProtocolBufferException.malformedVarint(); 

}

看起來像普通的舊java.io.