通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?
Posted
技术标签:
【中文标题】通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?【英文标题】:Sending file through ObjectOutputStream and then saving it in Java? 【发布时间】:2012-07-20 13:53:25 【问题描述】:我有这个简单的服务器/客户端应用程序。我试图让服务器通过 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());
所以,我的问题是如果没有损坏的文件,我无法正确地通过流获取对象。
【问题讨论】:
【参考方案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);
【讨论】:
我知道我错过了一步。我想在发送文件之前我必须做一些事情,因为该文件对象不完整。 尽管使用这种方法,您将在实际将字节写入套接字之前将整个文件读入内存。 @sarcan 为了简洁起见,我使用了Files.read
/ Files.write
方法。 OP 总是可以使用循环增量写入字节
@Jeffrey 我明白了,并不是要批评你,我的评论只是对 OP 的补充说明。
f.toPath() 未定义【参考方案2】:
您实际上不是在传输文件,而是从 Java 传输 File 实例。将您的 File 对象视为文件的(服务器)本地句柄,而不是其内容。要传输图像,您实际上必须先在服务器上读取它。
但是,如果您只是想在客户端上保存字节,您可以忘记 ObjectOutputStream 一开始。您可以只传输存储在文件中的字节。首先看一下 FileChannel 类及其 transferTo 和 transferFrom 方法。
【讨论】:
它甚至不是句柄,只是一个文件名,否则+1。以上是关于通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?的主要内容,如果未能解决你的问题,请参考以下文章
通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?
当两个客户端向服务器发送对象时,ObjectOutputStream writeObject 挂起
Android Socket + ObjectOutputStream 无法正常工作