4

我有这个简单的服务器/客户端应用程序。我试图让服务器通过 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());

所以,我的问题是如果没有损坏的文件,我就无法正确地通过流获取对象。

4

2 回答 2

11

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);
于 2012-07-21T16:08:30.367 回答
1

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

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

于 2012-07-21T16:11:50.080 回答