【问题标题】:How can I retrieve the output of an outputstream如何检索输出流的输出
【发布时间】:2015-08-17 03:25:43
【问题描述】:

我很清楚输出流仅用于写入数据。但我想检索它自己的输出,并且我知道在 FilterOutputStream 中有受保护的访问。是否有循环或捷径可以获取输出流的 .out 字段?

Socket socket = new Socket("localhost,4000);
DataOutputStream Data = new DataOutputStream(socket.getOutputStream());
Data.writeUTF("Hi");
System.out.println(Data.out); // What I want to achieve.

【问题讨论】:

  • 我非常怀疑这里有一个非常强大的XY problem。您能否详细说明您通过在此处尝试实现的目标来实现的目标?
  • 一个聊天程序。但我不想处理监听输入流的循环。
  • 使用问题中的方法是否有任何错误?或许可以提供更多细节。
  • “自己的输出”是什么意思? Data.out 存储对套接字输出流的引用。如果你想得到它,你可以打电话给socket.getOutputStream()
  • 但是当你告诉 System.out.println(socket.getOutputStream());它返回实际对象而不是写入的数据。

标签: java sockets outputstream


【解决方案1】:

要获取 out 字段,您可以派生 DataOutputStream 的子类并使输出流可公开检索:

class YourDataOutputStream extends DataOutputStream {
    public OutputStream getOut() {
        return out;
    }
}

但是,如果您真正想要做的是捕获通过套接字发送出去的数据,这将不会满足您的要求,因为它只会返回套接字返回的输出流对象。但是,您可以编写 FilterOutputStream 的子类,该子类覆盖 write() 方法以打印通过的数据,或将其存储在数组或文件中,然后再将数据写入底层输出流。覆盖方法看起来像:

public void write(int dataByte) {
    System.out.println(dataByte);
    out.write(dataByte);
}

然后,您将在套接字的输出流上构造此类的实例,并在此类的实例上构造 DataOutputStream。

【讨论】:

    【解决方案2】:

    你可以使用org.apache.commons.io.output.TeeOutputStream:

    OutputStream out1 = socket.getOutputStream();
    ByteArrayOutputStream out2 = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(new TeeOutputStream (out1, out2));
    out.writeUTF("Hi");
    System.out.println(Arrays.toString(out2.toByteArray()));
    

    【讨论】:

    • 我认为这正是他真正想要的,但他不知道。我认为他真的想向所有聊天客户端传播一次写入。附加到所有套接字输出流的一组嵌套 TeeOutputStream 将执行此操作,即new TeeOutputStream(new TeeOutputStream(socket1.getOutputStream(), socket2.getOutputStream()), socket3.getOutputStream()) 等等。
    • TeeInputStream 不适合聊天。如果一个客户端连接挂起,所有聊天都将挂起。在阻塞 IO 的情况下,每个客户端必须使用一个线程。
    • 有人提到TeeInputStream吗?我所看到的只是TeeOutputStream. 中的阻塞问题基本上来自 OP。
    【解决方案3】:
    Socket socket = new Socket("localhost,4000);
    DataOutputStream Data = new DataOutputStream(socket.getOutputStream());
    Data.writeUTF("Hi");
    System.out.println(Data.out); // What I want to achieve
    

    '[你]想要达到的'完全等同于

    System.out.println(socket.getOutputStream());
    

    这也是完全没有意义的。它只会打印java.net.SocketOutputStream@..... 之类的内容。不是“内容”,即所写的内容。

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2011-08-12
      相关资源
      最近更新 更多