两个输出流?

时间:2018-01-23 21:49:44

标签: java sockets io stream

我有以下代码,我试图创建两种不同类型的输出流。这似乎不起作用。创建两个输出流的正确方法是什么?具体来说,一个dataoutputstream和一个objectoutputstream?

connect();

try (DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream())) {
    try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {

        outputStream.writeUTF("saveFile");
        outputStream.writeUTF(serverName);
        File fileToSave = new File(localName);
        byte[] fileContent = Files.readAllBytes(fileToSave.toPath());

        objectOutputStream.writeObject(fileContent);

        return true;
    }
} catch (IOException e) {
    return false;
} finally {
    disconnect();
}

在进行一些调试之后,看起来就像输出流没有工作一样。如果我只有两个中的一个,那么两个" writeUTF"语句将执行。

如果我保留两个输出流,则消息永远不会到达服务器。

2 个答案:

答案 0 :(得分:0)

解决方案是将两个“writeUTF”语句移到第二个try块之上。

connect();

try (DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream())) {
    outputStream.writeUTF("saveFile");
    outputStream.writeUTF(serverName);

    try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {

        File fileToSave = new File(localName);
        byte[] fileContent = Files.readAllBytes(fileToSave.toPath());

        objectOutputStream.writeObject(fileContent);

        return true;
    }
} catch (IOException e) {
    return false;
} finally {
    disconnect();
}

现在代码正确执行。

答案 1 :(得分:0)

您的代码存在的问题是new ObjectOutputStream(...)会向流中写入标题,显然您的阅读代码与此代码并不对称,即它在构建之前执行readUTF()步骤ObjectInputStream,因此标题尚未消费,因此readUTF()步骤会看到它,然后是barf。

解决方案是你根本不需要这样做。 DataOutputStream在这里毫无意义。 ObjectOutputStream具有DatataOutputStream等所有方法,以及输入流的类似方法。

一般来说,当一个或多个流被缓冲时,这种事情是不可能的,因为ObjectInputStream是。