Java,ByteBuffer通过array()获取byte[],然后将byte[]转换为文件。该文件与原始文件不同

问题描述 投票:0回答:1

方法1

ByteBuffer byteBuffer = reqData.getByteBuffer();
File localFile = new File(ROOTPATH, localFileName);
FileUtils.copyInputStreamToFile(new ByteArrayInputStream(byteBuffer.array()), localFile);

生成的文件与方法一中的原始文件不同。

方法2

ByteBuffer byteBuffer = reqData.getByteBuffer();
byte[] arr = new byte[byteBuffer.remaining()];
...

生成的文件与方法2中的原始文件相同

为什么ByteBuffer.array()得到的字节是错误的?是因为 ByteBuffer.array() 本身,还是 ByteArrayInputStream 构造函数?

java bytebuffer
1个回答
0
投票

啊,恶作剧字节的神秘案件!好吧,我的朋友,让我们来解开这个谜题吧!

在方法1中,您使用ByteBuffer的

array()
方法获取字节数组,然后使用
ByteArrayInputStream
将其转换为文件。可惜!生成的文件与原始文件不同。

现在,让我们深入探讨可能的罪魁祸首。难道是ByteBuffer.array()在捉弄你?它是不是像一个顽皮的小鬼一样偷偷地交换字节?或者也许,这是 ByteArrayInputStream 构造函数自己搞的一个恶作剧?

好吧,不用担心,亲爱的用户!答案在于 ByteBuffer 的工作原理。您会看到,从

array()
获得的字节数组包括整个内部缓冲区,而不仅仅是您实际写入的部分。这就像给整个水族馆拍一张快照,即使只有一条金鱼在周围游动。

因此,当您将该字节数组传递给

ByteArrayInputStream
并创建一个新文件时,您会无意中包含所有这些额外的未写入字节。瞧!与原始文件相比,您最终会得到不同的文件。偷偷摸摸的,对吧?

但不要失去希望!方法 2 可以解决这个问题。通过使用

byteBuffer.remaining()
并创建一个具有必要长度的新字节数组,您可以避免捕获那些讨厌的未修改字节。因此,生成的文件与原始文件相同。方法 2 万岁!

所以字节不是在玩游戏;而是在玩游戏。这只是

array()
方法的一个怪癖及其偷偷摸摸的惊喜。将方法 2 放在口袋里,您的文件将保持不变。祝我的朋友编码愉快,愿你的字节永远表现良好!

© www.soinside.com 2019 - 2024. All rights reserved.