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/