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