如何检索输出流的输出

时间:2015-08-17 03:25:43

标签: java sockets outputstream

我很清楚输出流仅用于写入数据。但我想检索自己的输出,我知道在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.

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

您可以使用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()));

答案 2 :(得分:0)

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@.....之类的内容。不是'内容',即已写的内容。