我正在尝试使用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!另外,如果我忽略大小,只是开始阅读返回的字节,根本不匹配我的测试文件!
那么这里发生了什么?有没有办法解决这个问题?
答案 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()