FileChannel在assets文件夹中返回错误的文件文件大小

时间:2015-05-22 11:38:54

标签: java android assets fileinputstream

我正在尝试使用File从我的资源中的原始文件夹中读取FileInputStream

这就是我创建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!另外,如果我忽略大小,只是开始阅读返回的字节,根本不匹配我的测试文件!

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

1 个答案:

答案 0 :(得分:4)

当你的应用程序被编译时,所有资源都被打包成一个基本上是一个大的File。要获取您想要阅读的File个数据,您必须使用getStartOffset()的{​​{1}}和getDeclaredLength()。来自documentation

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

所以不要只是从头到尾读取整个getDeclaredLength(),而只需要从File返回的索引开始读取数据,并且需要读取{返回的字节数。 {1}}。尝试这样的事情:

getStartOffset()

如果您想考虑getDeclaredLength()返回long startOffset = fileDescriptor.getStartOffset(); long declaredLength = fileDescriptor.getDeclaredLength(); MappedByteBuffer mappedByteBuffer = fileChannel.map( FileChannel.MapMode.READ_ONLY, startOffset, declaredLength); 的情况,您可以这样做:

getDeclaredLength()