2012-10-08 18 views
0

我發現此代碼是爲了將文件編碼爲base64。它使用一個偏移量。有關在讀取調用中使用偏移量的說明

File filePath = new File("/sdcard/videooutput.mp4"); 
try{ 
    FileInputStream fin=new FileInputStream(filePath); 
    long length = filePath.length(); 
    // Create the byte array to hold the data 
    byte[] bytes = new byte[(int)length]; 
    // Read in the bytes 
    int offset = 0; 
    int numRead = 0; 
    while (offset<bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset))>=0){ 
     offset += numRead; 
    } 
    // Ensure all the bytes have been read in 
    if (offset < bytes.length) { 
    throw new IOException("Could not completely read file "+filePath.getName()); 
} 


Base64.encodeToString(bytes, Base64.DEFAULT); 

我不明白這段代碼是while (offset < bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset)) >= 0)

任何人都可以解釋代碼試圖做什麼?我只理解它檢查偏移量是否少於字節的長度,其餘的我不確定。

我的下一個問題是,什麼是使用偏移量來編碼文件的原因?

有關這個問題的任何答案都會很有幫助。對不起,問這種類型的問題,但我真的需要了解這個代碼。

+0

偏移量不是「用於編碼文件」,它是您讀取文件的位置的計數器。播放電腦:在紙上「執行」代碼時記下變量的值。在提供的代碼片段中沒有編碼發生,只是閱讀。 –

+1

而不是使用'offset',你可以使用'DataInputStream' –

+0

這不是編碼到base64。如果你想這樣做,那麼你可以使用核心'javax.xml.bind.DataConverter'或Apache Commons Codec。 – LanguagesNamedAfterCofee

回答

1

InputStream#read()

int numRead=fin.read(bytes, offset, bytes.length-offset)

讀取填充給定字節的數組,從在給定偏移量,對於給定的字節量。然而,即使你要求100字節,也不能保證你會得到它們。所以這段代碼基本上是在每次調用read()之後遞增偏移量。

初始調用將嘗試完全填充字節[]。如果失敗,它會將偏移量向前移動已成功複製的字節數,然後從新偏移量處開始填充字節[]。每次嘗試只嘗試讀取足夠的內容以填充緩衝區中留下的內容。

+0

謝謝@Greg。所以,讓我回顧一下我所理解的。偏移量是讀取文件的起點。同時字節是放置所有讀取字節的位置。所以,如果我想獲得已讀取的字節的值,我應該使用字節。我對嗎? –

+0

如果你真的想要讀取最後一個單字節,它將在'bytes [offset - 1]'中,否則所有讀取的東西都將在數組中,在循環結尾處將存在'bytes []'。所以你可以在數組中查看最後一個內容 –