2013-11-03 70 views
1

我在水庫未壓縮的二進制文件/生,我正在讀這樣:AssetFileDescriptor.getFileDescriptor()怎麼了?

public byte[] file2Bytes (int rid) { 
    byte[] buffer = null; 
    try { 
     AssetFileDescriptor afd = res.openRawResourceFd(rid); 
     FileInputStream in = new FileInputStream(afd.getFileDescriptor()); 
     int len = (int)afd.getLength(); 
     buffer = new byte[len]; 
     in.read(buffer, 0, len); 
     in.close(); 
    } catch (Exception ex) { 
     Log.w(ACTNAME, "file2Bytes() fail\n"+ex.toString()); 
     return null; 
    } 
    return buffer; 
} 

然而,buffer不包含什麼是應該。源文件基本上是1024個隨機字節(一個二進制密鑰)。但buffer,寫出來和審查時,是不一樣的。在開頭的不可打印字節中出現「res/layout/main.xml」(文字路徑),然後進一步向下,從res/raw另一個文件的部分文本內容。 O_O?

激怒了一段時間後,我想:

  AssetFileDescriptor afd = res.openRawResourceFd(rid); 
      //FileInputStream in = new FileInputStream(afd.getFileDescriptor()); 
      FileInputStream in = afd.createInputStream(); 

轉眼間,我得到了正確的內容 - 這是容易複製。

所以relevant API docs讀:

公衆的FileDescriptor getFileDescriptor()

返回,可用於在 文件中讀取數據的FileDescriptor。

公衆的FileInputStream createInputStream()

創建併爲這個資產返回一個新的自動關閉輸入流。此 將返回完整資產 AssetFileDescriptor.AutoCloseInputStream或基本 ParcelFileDescriptor.AutoCloseInputStream,具體取決於 對象是否代表文件的完整文件或子部分。您應該只爲此特定資產調用一次。

爲什麼從getFileDescriptor()構造的FileInputStream()結束於垃圾,而createInputStream()給出正確的訪問?

+0

是否有任何理由不是直接調用'openRawResource()'來直接獲取流,而不是無所顧忌地間接尋找? – CommonsWare

+1

同意CommonsWare,但如果你仍然想玩AFD,請參閱AFD.getStartOffset() – pskink

+0

@CommonsWare請參閱http://stackoverflow.com/questions/19743169/how-can-i-use-openrawresourcesfd/19743170 – delicateLatticeworkFever

回答

2

按pskink的評論,通過AssetFileDescriptor()返回的FileDescriptor顯然不是指只是到文件的FD - 它或許是指任何包/包/聚集AAPT取得了資源。

 AssetFileDescriptor afd = res.openRawResourceFd(rid); 
     FileInputStream in = new FileInputStream(afd.getFileDescriptor()); 
     in.skip(afd.getStartOffset());   

原來相當於FileInputStream in = afd.createInputStream()版本。

我想在「創建」(新的東西)和「獲得」(現有的東西)之間的區別暗示。 :/

0

AssetFileDescriptor可以被認爲是整個軟件包資產數據的入口點。

我遇到了同樣的問題並最終解決了它。

如果您想從AssetFileDescriptor手動創建流,則必須跳過n個字節以獲取請求的資源。這就像您正在將所有可用文件分頁到一個大文件中一樣。

感謝pskink!我看了一下我想要獲取的jpg圖像的十六進制內容,它以-1開頭。事情是,有兩個JPG圖像。我不知道,所以我任意跳過76L字節。得到第一個圖像!