从 InputStream 读取到 ByteBuffer.array() 时,丢弃前 4 个字节的数据

问题描述

让我给出我尝试过的简化版本。我有一个文件资产,其中包含一个原始数字数组(总共 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 (将#修改为@)