随机访问Android资产

时间:2014-03-07 21:42:50

标签: java android random inputstream assets

我想知道如何随机访问Android资产。 AssetManager类提供方法“open”,您可以将AssetManager.ACCESS_RANDOM传递给该方法。文档说,当你传递ACCESS_RANDOM时,你可以在文件中向前和向后搜索(特别是向后搜索是我需要的)。 但是,无论请求哪种访问模式,open方法总是返回一个InputStream对象。 所以我的问题是:如何在不提供此类方法的InputStream上调用seek方法?我必须向哪个类投射InputStream?我一直在网上搜索这个问题已有一段时间了,但我找不到任何帮助我的东西。

谢谢!

2 个答案:

答案 0 :(得分:0)

查看this source,方法open(String fileName, int accessMode)实际上会返回AssetInputStream

我没有对其进行测试,但您可以将InputStream方法的open()投射到AssetInputStreamoffers 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");