安卓资产的随机访问

4
我想知道如何在Android资产中实现随机访问。AssetManager类提供了“open”方法,您可以将AssetManager.ACCESS_RANDOM传递给该方法。文档说明,当传递ACCESS_RANDOM时,您可以向前和向后查找文件(尤其是我需要向后查找),但是无论请求哪种访问模式,open方法始终返回InputStream对象。 那么我的问题是:如何在不提供此类方法的InputStream上调用seek方法?我必须将InputStream转换为哪个类?我已经搜索了一段时间的网络,但我找不到任何有用的信息。 谢谢!
2个回答

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");

0

看一下这个源码,方法open(String fileName, int accessMode)实际上返回一个AssetInputStream

我没有测试过,但你可能可以将open()方法的InputStream强制转换为AssetInputStream,它提供了你要找的方法。特别是,skip(long n)方法将允许你跳过文件的前n个字节。

你可以试试看是否有效。

编辑:如果你想要完全随机访问文件,我想这是不可能的。请参见这个答案获取更多信息。


1
谢谢你的回答,但是我在AssetInputStream中也没有看到任何类似于“seek”的方法。难道我的眼睛上有番茄?:D - Paul H
很抱歉,我短暂地忘记您也想要能够向后走。我已相应地编辑了我的答案。 - Sebastiano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接