微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从 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 举报,一经查实,本站将立刻删除。