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

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

因此我想知道为什么每次在将文件字节读入“buffer”数组之前都需要初始化“buffer”数组,但是“buffer”数组的元素在每次循环结束时都在更改而不初始化数组。它与 ObjectOutputStream 的 writeObject() 方法的机制有关吗?我迫切希望知道,感谢您的帮助!

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

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

最佳答案

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

关于java - Java 的 ObjectOutputStream 的 writeObject() 方法如何用于数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49808912/

相关文章:

javascript - 解析命题逻辑串

c# - 排序一个字符数组,使所有元音都出现在最后

java - 用户关键字替换密码在两个不同大小的数组上循环

javascript - 有没有一种方法可以指定在序列化时将对象的哪些数据传递给序列化程序?

javascript - JSON java servlet

java - Wicket 标签中的嵌套链接

java - 将 Guava MultiTreemap 放入 http session 时出现 NotSerializedException

c# - 序列化 TreeView 时丢失数据

java - Leap Motion震颤识别?

java - Google Collections 相当于 Apache Commons Collections ArrayUtils.toObject 和 ArrayUtils.toPrimitive