有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过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());

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


共 (2) 个答案

  1. # 1 楼答案

    File对象表示该文件的路径,而不是其实际内容。您应该做的是从该文件中读取byte,然后通过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);
    
  2. # 2 楼答案

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

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