求助:Java的ObjectOutputStream的writeObject()方法如何适用于数组?

时间:2018-04-13 03:34:00

标签: java arrays serialization objectoutputstream

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”数组写入文件,当文件完成传输时,我发送一个字符串包含“ 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());

1 个答案:

答案 0 :(得分:1)

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