BufferedReader brkeyb = null;
ServerSocket ss = null;
Socket sock = null;
OutputStream os = null;
try {
ss = new ServerSocket(9999);
System.out.println("服务器启动");
sock = ss.accept();
os = sock.getOutputStream(); PrintStream ps = new PrintStream(os);
brkeyb = new BufferedReader(new InputStreamReader(System.in)); while (flag) {
//从键盘读取信息发往客户端
String sk = brkeyb.readLine();
ps.println("Server: " + sk); //@1@ 不加ps.flush()也能把消息发往客户端
}
                   } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
br.close();
sock.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} }提问:@1@ 处我不加ps.flush()也能把消息发往客户端,但是public PrintStream(OutputStream os)创建的是不带自动刷新的流,怎么能自动刷新呢?

解决方案 »

  1.   

    这个流不是缓冲流,应该不用flush吧?
      

  2.   

    虽然你调用的是不会自动flush的Stream,但是PrintStream实际上写入的已经是sock.getOutputStream(),所有的输出都已经直接写入该流了。已经会发送到服务器上
    如果你再增加一层BufferedOutputStream—— new PrintStream(new BufferedOutputStream(os));则会出现不同的结果,但是要注意BufferedOutputStream仍然会在Buffer满的时候发送数据的,只是时间不确定罢了。
    autoFlush是保证调用了print方法之后一定会flush而已。
      

  3.   

    楼主:我是想弄明白为什么创建不带自动刷新的PrintStream不调用flush也能把数据写入文件或socket,而PrintWriter必须调用flush才能把数据写入文件或socket
      

  4.   

    是的
    http://www.khgl.cn/html/78/n-522578.html  看看这个
    得出结果是:只有加了BufferedOutputStream才能谈刷不刷新的问题
      

  5.   

    PrintWriter需要flush是因为Writer本身就存在write之后并没有马上写入OutputStream的问题
      

  6.   

    PrintStream
    当写入回车换行时,自动flush
      

  7.   

    PrintStream是个什么东西啊,见过但不知道是什么意思