【问题标题】:How does Java's ObjectOutputStream's writeObject() method work for array?Java 的 ObjectOutputStream 的 writeObject() 方法如何用于数组?
【发布时间】:2018-09-23 08:04:19
【问题描述】:
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)被调用之前检查了数组的值,将它们打印到屏幕上,元素的值实际上发生了变化。然后通过在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();
}

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

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

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

【问题讨论】:

    标签: java arrays serialization objectoutputstream


    【解决方案1】:

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

    【讨论】:

    • 所以buffer = new byte[8192] 改变了阵列的序列号?除了再次初始化之外,还有其他方法可以更改数组的序列号吗?顺便说一句,感谢您回答我的问题,这很有帮助!
    • 这是一个不同的 ID,因为new byte[8192] 是一个不同的对象。除了使用不同的对象之外,没有其他方法可以更改它。
    • 感谢您的回答!
    • 好吧,你可以用writeUnshared()代替writeObject(),然后同一个数组会被重新序列化。
    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2023-03-26
    • 2011-05-22
    • 1970-01-01
    • 2013-11-20
    • 2015-01-09
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多