gpt4 book ai didi

java - Assets +skipBytes性能

转载 作者:行者123 更新时间:2023-12-01 13:15:36 25 4
gpt4 key购买 nike

DataInputStream istream = new DataInputStream(inputstream);
istream.skipBytes(offset);
int value = istream.readInt();

inputstream来自getAssets().open("abc")并且文件很大(最大20mb)时,这样简单的seek+read需要花费很多时间完成时间(在我的 Android 手机上约为 250 毫秒)。

当我第一次将文件复制到 getCacheDir().getPath() 时,相同的代码将花费不到 1 毫秒(如果忽略复制的启动时间 ~3 秒)。另外,应用程序将使用更多空间,一次来自副本,一次来自 Assets 。

我只在不同位置读取了大约 6 个值 (readInt())。

现在我的问题是,是否可以提高 Assets skipByte的性能?如果是的话怎么办?如果没有,是否有替代方法,而不是复制文件?

最佳答案

最后我找到了一个可行的替代方案,而不是复制资源。

示例代码

    try {
AssetFileDescriptor fd_description = getAssets().openFd("test.raw");
String apk_path = getPackageResourcePath(); //maybe getPackageCodePath() ?
RandomAccessFile file = new RandomAccessFile(apk_path, "r");
file.seek(fd_description.getStartOffset());
String value = file.readLine();
Log.e("RAW ACCESS", "READ:" + value);
file.seek(fd_description.getStartOffset());
value = file.readLine();
Log.e("RAW ACCESS", "READ:" + value);
} catch (IOException exp){
Log.e("RAW ACCESS", "ERROR:"+exp.toString());
}

一些信息

getPackageResourcePath() 返回 APK 的路径

getAssets().openFd("test.raw") 返回您在 APK 中查找数据所需的 Assets 信息

您的资源从 fd_description.getStartOffset() 开始,到 fd_description.getStartOffset()+fd_description.getLength() 结束

使用 if (fd_description.getLength() != fd_description.getDeclaredLength()) 您可以检查 Assets 是否被压缩。

重要

当然,这仅在 Assets 未压缩的情况下才有效!但禁用压缩并不难。

关于java - Assets +skipBytes性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22499571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com