Java 的 ObjectOutputStream 的 writeObject() 方法如何用于数组?

How does Java's ObjectOutputStream's writeObject() method work for array?

File file = new File(path);
if (file.exists())
{
    int count;
    byte[] buffer = new byte[8192];

    BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(file));
    while ((count = fileReader.read(buffer)) >= 0)
    {
        fileOut.writeObject(buffer);
        fileOut.writeObject(count);
    }
    fileOut.writeObject("EOF");
    fileReader.close();
}

以上是我最初用来将文件传输到套接字的服务器端代码。我首先发送一个名为 "buffer" 的字节数组,然后发送一个名为 "count" 的 int 变量来告诉客户端需要将 "buffer" 数组的多少字节写入文件,当文件完成时 t运行sferring,我发送一个包含 "EOF" 的字符串让客户知道文件 t运行sferring 已经完成,以防止在客户端进一步阅读。但是,当我 运行 这个程序时,奇怪的事情出现了,服务器发送的 "buffer" 数组的元素在第一次循环后没有改变,这意味着在第一次循环后,服务器继续发送 "buffer" 数组包含与第一个循环中的元素相同的元素,但我确实在调用 fileOut.writeObject(buffer) 之前检查了数组的值,方法是将它们打印到屏幕上,并且元素的值实际上发生了变化。然后在fileOut.writeObject(count)之后又加了一行代码buffer = new byte[8192]就解决了这个问题,代码变成:

File file = new File(path);
if (file.exists())
{
    int count;
    byte[] buffer = new byte[8192];

    BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(file));
    while ((count = fileReader.read(buffer)) >= 0)
    {
        fileOut.writeObject(buffer);
        fileOut.writeObject(count);
        buffer = new byte[8192];
    }
    fileOut.writeObject("EOF");
    fileReader.close();
}

因此我想知道为什么我需要在每次将文件字节读入"buffer"数组之前初始化"buffer"数组,但是"buffer"数组的元素在没有初始化的情况下发生了变化每次循环结束时的数组。它与 ObjectOutputStream 的 writeObject() 方法的机制有关吗?急求知道,谢谢大家的帮助!

PS: fileOut是一个实例变量,由以下代码初始化:

fileOut = new ObjectOutputStream(socket.getOutputStream());

这不是数组特有的问题。 Java 序列化按 ID 对对象进行编号,然后只传输每个不同的对象一次(这可以防止循环图出现问题)。每次尝试再次发送数组时,流只会重复数组对象的 ID。另一方面,如果您比较参考文献,您会发现它们是 ==。 (您还应该能够看出写入额外的 8k 只会使输出大小增加几个字节。)