【问题标题】:FileChannel returns wrong file size of file in assets folderFileChannel 返回资产文件夹中文件的错误文件大小
【发布时间】:2015-05-22 11:38:53
【问题描述】:

我正在尝试使用 FileInputStream 从我的资产中的原始文件夹中读取 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!此外,如果我忽略大小并开始读取返回的字节,则根本不匹配我的测试文件!

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

【问题讨论】:

  • 你为什么要费尽心思去读 13 个字节?为什么不直接使用 FileInputStream?源代码和字节码比文件中的字节多。
  • @EJP 我需要从应用程序中的文件中读取 80K 整数,这就是我需要 nio 的原因

标签: java android assets fileinputstream


【解决方案1】:

当您的应用程序被编译时,所有资源都被打包成一个大的File。要仅获取您想要读取的File 的数据,您必须使用AssetFileDescriptorgetStartOffset()getDeclaredLength()。来自documentation

  • getStartOffset():返回此资产条目数据开始的字节偏移量。
  • getDeclaredLength():返回构造 AssetFileDescriptor 时声明的实际字节数。将会 UNKNOWN_LENGTH 如果没有声明长度,意味着数据应该是 读到文件末尾。

因此,您无需从头到尾读取整个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;
}

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2012-02-22
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多