2013-11-02 45 views
1

我在res/raw文件,我想這樣打開:如何使用openRawResourcesFd()?

AssetFileDescriptor afd = getResources().openRawResourcesFd(); 

這允許,例如,獲得通過afd.getLength(),這InputStream.available()不答應,哪怕似乎到最終文件大小一般工作。

然而,當我試試這個失敗:

java.io.FileNotFoundException:該文件無法打開的文件 描述;它可能是壓縮的

這些只是小文本文件。有什麼問題?

回答

3

aapt壓縮大部分資源作爲構建過程的一部分。據this article它引用的是AAPT來源,例外情況是:

/* these formats are already compressed, or don't compress well */ 
static const char* kNoCompressExt[] = { 
    ".jpg", ".jpeg", ".png", ".gif", 
    ".wav", ".mp2", ".mp3", ".ogg", ".aac", 
    ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", 
    ".rtttl", ".imy", ".xmf", ".mp4", ".m4a", 
    ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2", 
    ".amr", ".awb", ".wma", ".wmv" 
}; 

所以一個來解決這個問題的方法是通過欺騙與這些擴展的一個重命名文件AAPT。

這可能看起來不太令人滿意。如果您想將擴展名添加到例外列表中,則可以編輯[sdk]/tools/ant/build.xml。在文件中搜索nocompress

 <aapt executable="${aapt}" 
       command="package" 
       versioncode="${version.code}" 
       versionname="${version.name}" 
       debug="${build.is.packaging.debug}" 
       manifest="${out.manifest.abs.file}" 
       assets="${asset.absolute.dir}" 
       androidjar="${project.target.android.jar}" 
       apkfolder="${out.absolute.dir}" 
       nocrunch="${build.packaging.nocrunch}" 
       resourcefilename="${resource.package.file.name}" 
       resourcefilter="${aapt.resource.filter}" 
       libraryResFolderPathRefid="project.library.res.folder.path" 
       libraryPackagesRefid="project.library.packages" 
       libraryRFileRefid="project.library.bin.r.file.path" 
       previousBuildType="${build.last.target}" 
       buildType="${build.target}" 
       ignoreAssets="${aapt.ignore.assets}"> 
      <res path="${out.res.absolute.dir}" /> 
      <res path="${resource.absolute.dir}" /> 
      <nocompress extension="txt"/> 
      <!-- <nocompress /> forces no compression on any files in assets or res/raw --> 
      <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw --> 
     </aapt> 

底部的註釋是不言自明的。我插入了txt的例外。注意你也可以一起關閉壓縮。

或者,創建一個特殊的擴展:

<nocompress extension="nocomp"> 

和重命名文件,例如,whatever.txt.nocomp。通過這種方式,您可以將壓縮保留在除特定文件外的所有內容上