问题描述
- java关于PrintWriter调用write方法之后使用flush方法获取不到内容原因探究求解惑!
-
PrintWriter ps= new PrintWriter(socket.getOutputStream());ps.write( "hello" );
ps.flush();
服务端获取不到hello信息,看了下PrintWriter源码,flush()中调用的是BufferedWriter中的flush(),如果这样的话,应该能刷新缓冲得到结果。但是没有。。。网上找到个说法,原文是这样的"为什么客户端调用了write()和flush()后,服务器端依然read不到数据。因为socket.getOutputStream()取到的实现类是java.net.SocketOutputStream,这个类并没有覆写flush方法,它的父类java.io.FileOutputStream也没有覆写,于是最终就调到了最顶层java.io.OutputStream的flush()方法,这就恶心了,这个方法是空的。于是...",如果这个说法是对的话,为什么我定义的PrintWriter对象会调用SocketOutputStream里面的flush()?如果这个说法不对,那么是什么导致调用write()之后flush()无效?求解惑,万分感谢!
解决方案
.close()之后才会有内容吧
解决方案二:
对,close()确实可以,但是flush()为什么不可以呢
解决方案三:
为什么我定义的PrintWriter对象会调用SocketOutputStream里面的flush()?
flush是一层层传下去的啊……PrintWriter.flush()调用BufferedWriter.flush(),BufferedWriter.flush()调用OutputStreamWriter.flush(),然后调用StreamEncoder.flush()。StreamEncoder的源代码没找到,但肯定最后还是调用了SocketOutputStream.flush()……
但是SocketOutputStream.flush()为空应该不构成问题,因为SocketOutputStream本身不缓存任何内容,而是将得到字节的立即输出,所以不需要flush
解决方案四:
我这里贴下主要的2个方法
public void createClientSocket(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Socket s = new Socket("127.0.0.1", 9009);
PrintWriter pw = new PrintWriter(s.getOutputStream());
String str = br.readLine();
while(!"quit".equals(str)){
//这两行server端可以获取str
// pw.println(str);
// pw.flush();
//这两行server端获取不到str
pw.write(str);
pw.flush();
str = br.readLine();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void createServerSocket(){
try {
ServerSocket ss = new ServerSocket(9009);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str;
while((str = br.readLine())!=null){
System.out.println(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}