问题描述
让我给出我尝试过的简化版本。我有一个文件资产,其中包含一个原始数字数组(总共 N 个数字,每个数字为 4 个字节宽)。我使用 InputStream
创建一个 AssetManager
并尝试将所有数据推送到直接 ByteBuffer
中:
try (InputStream inputStream = assetsManager.open(assetFileName)) {
int size = inputStream.available();
assert size % 4 == 0;
ByteBuffer bytes = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder());
inputStream.read(bytes.array());
}
我认为这应该可以正常工作,但是我遇到了我的程序的一些奇怪行为,这让我认为数据加载毕竟不正确,并且确实在对 {{1 中的第一个内容进行了一些调试记录之后}} 并将其与十六进制查看器中的文件内容进行比较,我发现这种方法不会读取前 4 个字节,即 bytes
内容从我的第二个 4 字节宽的数字开始。我承认我没有检查 bytes
末尾包含的内容,但让我们假设它只是零。
然后我采用了另一种方法,它完全正确地读取了所有字节(但它有点难看,我想避免它):
bytes
我真的是 Java 和 Android 开发的菜鸟,所以我问这是平台端的错误,还是关于 try (InputStream inputStream = assetsManager.open(assetFileName) {
int size = inputStream.available();
byte[] bytesArray = new byte[size];
inputStream.read(bytesArray,size);
ByteBuffer bytes = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder());
bytes.put(bytesArray);
bytes.rewind();
}
/ InputStream
的一些事情我需要更仔细地处理实现正确读取数据?
我检查了这个听起来很相似的问题,但它是关于 C# 的: NetworkStream cuts off first 4 bytes when reading
这让我觉得我也应该分块读取数据并把它们一个一个地放在AssetManager.open(...)
中,但我的文件不大(小于16MB)而且读取时显然没有数据竞争,所以我认为 ByteStream
不应该那么奇怪地失败...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)