通过ObjectOutputStream发送文件,然后将其保存在Java中?

我有这个简单的服务器/客户端应用程序 我正在尝试让服务器通过OutputStream(FileOutputStream,OutputStream,ObjectOutputStream等)发送文件,并在将其保存到实际文件之前在客户端接收它。 问题是,我试过这样做,但它一直都失败了。 每当我创建文件并将从服务器收到的对象写入其中时,我都会得到一个损坏的图像(我只是将其保存为jpg,但这无关紧要)。 以下是最有可能出现故障的代码部分(您在此处看到的所有看似未声明的对象都已事先声明过):

服务器:

ObjectOutputStream outToClient = new ObjectOutputStream( connSocket.getOutputStream()); File imgFile = new File(dir + children[0]); outToClient.writeObject(imgFile); outToClient.flush(); 

客户:

 ObjectInputStream inFromServer = new ObjectInputStream( clientSocket.getInputStream()); ObjectOutputStream saveImage = new ObjectOutputStream( new FileOutputStream("D:/ServerMapCopy/gday.jpg")); saveImage.writeObject(inFromServer.readObject()); 

所以,我的问题是我无法正确地通过流获取对象而不会丢失文件。

File对象表示该File路径 ,而不是其实际内容。 你应该做的是从该文件中读取byte s并通过ObjectOutputStream发送它们。

 File f = ... ObjectOutputStream oos = ... byte[] content = Files.readAllBytes(f.toPath); oos.writeObject(content); 

 File f=... ObjectInputStream ois = ... byte[] content = (byte[]) ois.readObject(); Files.write(f.toPath(), content); 

您实际上并没有从Java传输文件,而是传输File实例。 将您的File对象视为文件的(服务器 – )本地句柄,但不是其内容。 要传输图像,您实际上必须先在服务器上读取它。

但是,如果您只是要在客户端上保存字节,您可以忘记开始使用的ObjectOutputStream。 您只需传输存储在文件中的字节即可。 看一下FileChannel类及其transferTo和transferFrom方法作为开始。