gpt4 book ai didi

java - FileChannel 返回 Assets 文件夹中文件的错误文件大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:51 27 4
gpt4 key购买 nike

我正在尝试使用 FileInputStream 从我的 Assets 中的原始文件夹中读取一个 File

这就是我创建 FileInputStream 的方式:

AssetManager assetManager = getAssets();
AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());

之后,我尝试像这样从 File 中读取数据:

FileChannel fileChannel = inputStream.getChannel();

MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
IntBuffer intBuffer = mappedByteBuffer.asIntBuffer();

int[] array = new int[intBuffer.limit()];
intBuffer.get(array);

inputStream.close();
fileChannel.close();

但这行不通。出于某种原因,fileChannel.size() 返回了一个巨大的数字。我有一个恰好 13 个字节长的测试文件,但 fileChannel.size() 返回 1126498!此外,如果我忽略大小并开始读取返回的字节,则根本不匹配我的测试文件!

那么这里发生了什么?有什么办法可以解决这个问题吗?

最佳答案

当您的应用程序被编译时,所有资源都被打包到本质上是一个大的文件中。要仅获取您想要读取的一个 File 的数据,您必须使用 getStartOffset()getDeclaredLength() Assets 文件描述符。来自documentation :

  • getStartOffset(): Returns the byte offset where this asset entry's data starts.
  • getDeclaredLength(): Return the actual number of bytes that were declared when the AssetFileDescriptor was constructed. Will be UNKNOWN_LENGTH if the length was not declared, meaning data should be read to the end of the file.

因此,与其从头到尾读取整个 File,不如从 getStartOffset() 返回的索引处开始读取数据,并且需要读取与 getDeclaredLength() 返回的字节一样多。尝试这样的事情:

long startOffset = fileDescriptor.getStartOffset();
long declaredLength = fileDescriptor.getDeclaredLength();
MappedByteBuffer mappedByteBuffer = fileChannel.map(
FileChannel.MapMode.READ_ONLY,
startOffset,
declaredLength);

如果您想考虑 getDeclaredLength() 返回 UNKNOWN_LENGTH 的情况,您可以这样做:

if(declaredLength == AssetFileDescriptor.UNKNOWN_LENGTH) {
declaredLength = fileChannel.size() - startOffset;
}

关于java - FileChannel 返回 Assets 文件夹中文件的错误文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395744/

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