У меня есть файлы в res/raw
, которые я хотел бы открыть следующим образом:
AssetFileDescriptor afd = getResources().openRawResourcesFd();
Это позволяет, например, получить окончательный размер файла с помощью afd.getLength()
, который InputStream.available()
не обещает, даже если он, как правило, работает.
Однако, когда я пытаюсь это сделать, это терпит неудачу:
java.io.FileNotFoundException: этот файл нельзя открыть как файл дескриптор; он, вероятно, сжат
Это лишь небольшие текстовые файлы. В чем проблема?
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"
};
Таким образом, один из способов обойти эту проблему - обмануть 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
. Таким образом, вы можете оставить сжатие для всего, кроме отдельных файлов.