我在水庫未壓縮的二進制文件/生,我正在讀這樣: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();
轉眼間,我得到了正確的內容 - 這是容易複製。
公衆的FileDescriptor getFileDescriptor()
返回,可用於在 文件中讀取數據的FileDescriptor。
公衆的FileInputStream createInputStream()
創建併爲這個資產返回一個新的自動關閉輸入流。此 將返回完整資產 AssetFileDescriptor.AutoCloseInputStream或基本 ParcelFileDescriptor.AutoCloseInputStream,具體取決於 對象是否代表文件的完整文件或子部分。您應該只爲此特定資產調用一次。
爲什麼從getFileDescriptor()構造的FileInputStream()結束於垃圾,而createInputStream()給出正確的訪問?
是否有任何理由不是直接調用'openRawResource()'來直接獲取流,而不是無所顧忌地間接尋找? – CommonsWare
同意CommonsWare,但如果你仍然想玩AFD,請參閱AFD.getStartOffset() – pskink
@CommonsWare請參閱http://stackoverflow.com/questions/19743169/how-can-i-use-openrawresourcesfd/19743170 – delicateLatticeworkFever