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

问题描述 投票:0回答:1
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();
}

以上是我最初用于将文件传输到套接字的服务器端代码。我先发送一个称为“缓冲区”的字节数组,然后发送一个称为“计数”的int变量,以告诉客户端需要将多少个“缓冲区”数组的字节写入文件,当文件完成传输后,我发送一个包含“ EOF”,以使客户端知道文件传输已完成,以防止在客户端进一步读取。但是,当我运行该程序时,出现了奇怪的事情,服务器发送的“缓冲区”数组的元素在第一次循环后没有更改,这意味着在第一次循环之后,服务器一直在发送“缓冲区”数组,该数组包含与第一个循环中的那个,但是我确实在通过调用fileOut.writeObject(buffer)并将其打印到屏幕上之前检查了数组的值,并且元素的值实际上发生了变化。然后通过在buffer = new byte[8192]之后添加另一行代码fileOut.writeObject(count)来解决此问题,该代码变为:

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();
}

因此,我想知道为什么每次在将文件的字节读入“缓冲区”数组之前都需要初始化“缓冲区”数组,但是“缓冲区”数组的元素在每次循环结束时都没有初始化数组而变化了。它与ObjectOutputStream的writeObject()方法的机制有关吗?敦促我知道,谢谢您的帮助!

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

fileOut = new ObjectOutputStream(socket.getOutputStream());
java arrays serialization objectoutputstream
1个回答
1
投票

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

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