我很清楚输出流仅用于写入数据。但我想检索自己的输出,我知道在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.
答案 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@.....
之类的内容。不是'内容',即已写的内容。