我想知道如何随机访问Android资产。 AssetManager类提供方法“open”,您可以将AssetManager.ACCESS_RANDOM传递给该方法。文档说,当你传递ACCESS_RANDOM时,你可以在文件中向前和向后搜索(特别是向后搜索是我需要的)。 但是,无论请求哪种访问模式,open方法总是返回一个InputStream对象。 所以我的问题是:如何在不提供此类方法的InputStream上调用seek方法?我必须向哪个类投射InputStream?我一直在网上搜索这个问题已有一段时间了,但我找不到任何帮助我的东西。
谢谢!
答案 0 :(得分:0)
查看this source,方法open(String fileName, int accessMode)
实际上会返回AssetInputStream
。
我没有对其进行测试,但您可以将InputStream
方法的open()
投射到AssetInputStream
,offers the methods您正在寻找。特别是,skip(long n)
方法将允许您跳过文件的第一个n
字节。
您可以尝试一下,看看它是否有效。
编辑:如果您正在寻找对该文件的完全随机访问,我想这是不可能的。有关详细信息,请参阅this answer。答案 1 :(得分:0)
将资产文件复制到缓存/临时文件,然后将其打开以进行随机访问,如下所示(添加错误/写入错误处理)
File outputDir = context.getCacheDir();
File destFile = new File(outputDir, "asset_filename");
OutputStream dest = new FileOutputStream(destFile, true);
InputStream src = context.getAssets().open("asset_directory/asset_filename", ACCESS_STREAMING);
byte[] buff = new byte[100*1024];
for(;;)
{
int cnt = src.read(buff);
if(cnt <= 0)
break;
dest.write(buff, 0, cnt);
}
dest.flush();
dest.close();
assetFile = new RandomAccessFile(destFile, "r");