为什么我通过 TCP 发送的文件包含的数据比它本身包含的文件多?

Why does my file, sent through TCP, contain more data than the file it self contains?

我一直在尝试通过 TCP 向我的一位同事发送文件,并检查文件是否正确到达。我们已成功发送包含一些文本的简单 .txt 文件,但有些地方不对。

每当通过 txt 发送邮件时,文件本身包含的内容比原始邮件多? 例如,我的同事发送了内容为 123456789012345678901234567890123 的 .txt 文件。它使用 DataOutputStreamFileInputStream 发送,并使用 file.length.

进行动态文件大小检查

动态文件大小变量被馈送到 byte[] buffer = new byte[filesize]

我们最终使用

发送了它
while (fis.read(buffer) > 0) {
        dos.write(buffer);
    }
    
    fis.close();
    dos.close();    
}

使用这种方法会产生以下结果:

sent:     123456789012345678901234567890123
received: 12345678901234567890123456789012378

可以看出,出于某种原因,78 被粘贴在消息后面,我们无法弄清楚发生了什么,我们想知道发生了什么。

更奇怪的是,经过多次尝试,发送的消息按原样接收/到达,没有任何额外的乱码?这很不正常。

非常感谢任何输入,谢谢!

while (fis.read(buffer) > 0) {
    dos.write(buffer);

您假设读取填充了整个缓冲区。大多数情况下,它可能会这样做。但有时,只读取缓冲区的部分

来自javadoc

returns the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

因此,read() 方法会告诉您读取了多少字节。你必须确保继续阅读,直到你完全把你的字节放在一起!否则,您将使用仅 部分 填充了新数据的缓冲区。