1

res/raw次のように開きたいファイルがあります。

AssetFileDescriptor afd = getResources().openRawResourcesFd();

これにより、たとえば、 を介して最終的なファイル サイズを取得することが可能afd.getLength()InputStream.available()なります

ただし、これを試すと失敗します:

java.io.FileNotFoundException: このファイルはファイル記述子として開くことができません。おそらく圧縮されている

これらは単なる小さなテキスト ファイルです。どうしたの?

4

1 に答える 1

4

aaptビルド プロセスの一部として、ほとんどのリソースを圧縮します。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"
};

したがって、この問題を回避する 1 つの方法は、これらの拡張子のいずれかでファイルの名前を変更して 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。このようにして、特定のファイルを除くすべての圧縮をオンのままにすることができます。

于 2013-11-02T14:54:18.857 に答える