【问题标题】:Two outputstreams?两个输出流?
【发布时间】:2018-07-02 20:14:42
【问题描述】:

我有以下代码,我试图在其中创建两种不同类型的输出流。这似乎不起作用。创建两个输出流的正确方法是什么?具体来说,一个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”语句将执行。

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

【问题讨论】:

  • 请定义“似乎不起作用”。
  • 抱歉,更新主帖
  • 你有什么理由不使用这样的try语句:try (DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {跨度>
  • 我建议在其中添加一些日志记录语句,看看它卡在哪里。
  • 另外,写出你的异常堆栈跟踪。

标签: java sockets io stream


【解决方案1】:

解决方案是将两个“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();
}

现在代码可以正常执行了。

【讨论】:

  • 解决方案是让您的发送代码与您的接收代码完全对称,但显然不是这样。或者完全失去DataInput/OuputStreams。
【解决方案2】:

您的代码的问题是new ObjectOutputStream(...) 将标头写入流,显然您的读取代码与此代码不对称,即它在构造ObjectInputStream 之前执行readUTF() 步骤,所以标题还没有被消耗,所以readUTF() 步骤看到它,然后barf。

解决方案是您根本不需要这样做。 DataOutputStream 在这里完全没有意义。 ObjectOutputStream 拥有DatataOutputStream 的所有方法,还有更多,对于输入流也是如此。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多