让我给出我尝试过的简化版本。我有一个文件资产,其中包含一个原始数字数组(总共 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());
}
我认为这应该可以正常工作,但是我遇到了我的程序的一些奇怪行为,这让我认为数据加载毕竟不正确,事实上,在对内部的第一个内容进行了一些调试日志记录bytes
并将其与文件进行比较之后十六进制查看器中的内容我发现这种方法不会读取前 4 个字节,即bytes
内容从我的第二个 4 字节宽的数字开始。我承认我没有检查 末尾包含的内容bytes
,但我们假设它只是零。
然后我采用了另一种方法,它完全正确地读取了所有字节(但它有点难看,我想避免它):
try (InputStream inputStream = assetsManager.open(assetFileName) {
int size = inputStream.available();
byte[] bytesArray = new byte[size];
inputStream.read(bytesArray, 0, size);
ByteBuffer bytes = ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder());
bytes.put(bytesArray);
bytes.rewind();
}
我真的是Java和Android开发的菜鸟,所以我问这是一个平台端的错误,还是我需要更仔细地处理InputStream
/AssetManager.open(...)
以实现正确读取数据?
我已经检查了这个听起来很相似的问题,但它是关于 C#: NetworkStream 在阅读时切断前 4 个字节
这让我觉得我也应该分块读取数据并把它们ByteStream
一个一个地放入,但是我的文件并不大(小于 16MB),而且读取时显然没有数据竞争,所以我认为inputStream.read(bytes.array());
不应该那么奇怪地失败。 ..