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

2019-06-26 10:52发布

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

所以,我的问题是,我不能获得通过流对象正确没有得到一个破碎的文件。

Answer 1:

一个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);


Answer 2:

你是不是实际传输文件,但是从Java文件实例。 想想你的文件对象作为(服务器 - )本地句柄的文件,而不是它的内容。 在传送图像,你居然还要先读它的服务器上。

但是,如果你只是要保存在客户端上的字节无论如何,你可以对ObjectOutputStream的开始与忘记。 您只需将存储在文件中的字节。 看看在FileChannel类和它的transferTo和transferFrom方法作为开始。



文章来源: Sending file through ObjectOutputStream and then saving it in Java?