博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA printWriter中write()和println()区别(特别注意)
阅读量:3589 次
发布时间:2019-05-20

本文共 1986 字,大约阅读时间需要 6 分钟。

最近学习JAVA网络编程,在服务器端和客户端产生一个Socket 后,

两边各自用getIputStream()和getOutputStream()方法,构造各自的输入输出流。

其中服务器端的Socket ss

BufferedReader is=new BufferedReader(new InputStreamReader(ss.getInputStream()) );

PrintWriter  os=new PrintWriter (new OutputStreamWriter(ss.getOutputStream()) );

os.writer("一个乱七八糟的字符串");

客户端的Socket cs

BufferedReader is=new BufferedReader(new InputStreamReader(cs.getInputStream()) );

PrintWriter  os=new PrintWriter (new OutputStreamWriter(cs.getOutputStream()) );

System.out.println(is.readLine());

按理说,应该是ss的 os对应着cs的 is.  为什么在服务器端写入了,在客户端这边没法读出来呢?

另外,如果服务器端用os.println("字符串");就好使了。

请问这是问什么? 

以下整理了开源中国社区的回答:

  • print() 方法等同于 write() 方法

    println() 方法是在 print() 的基础上多调用了一个 newLine() 方法(私有方法)

    而 newLine() 方法会调用 flush()

    所以关键在于 flush()

  • 补充下,我只是把我出问题的关键程序段概括的写出来了,不要说我没刷新服务器Socket的输出流。

    最好有个人能好好解释解释有关IO中的输出流中的writer。以及如何从一个输出流中提取用write()方法写入到该流中的字符。

  • 你用PrintWriter,确实就应该调用println()方法,而不是父类集成过来的write方法。因为PrintWriter本身就是用来执行Print操作的。显然那个write方法是直接继承了父类的方法,可能子类中没有重写或者做了其他操作。

    btw socket通信最好使用DataInputStream和DataOutputStream去封装读写的操作,或者用 ObjectInputStream和ObjectOutputStream,而不要使用你写的BufferedReader和 BufferedWriter。

  • 关键是客户端是
    is.readLine(),println是会自动在字符后面加上回车换行符的,或者你在服务端os.writer("
    一个乱七八糟的字符串\r\n");
     
    •  的确是要加上/r /n 有没有比较详细的原因? 
  • 查了一下,网上有很多人问这个问题,老外多一下。

    问题主要集中在,为什么客户端调用了write()和flush()后,服务器端依然read不到数据。因为 socket.getOutputStream()取到的实现类是java.net.SocketOutputStream,这个类并没有覆写flush 方法,它的父类java.io.FileOutputStream也没有覆写,于是最终就调到了最顶层java.io.OutputStream的 flush()方法,这就恶心了,这个方法是空的。于是...

    因此,还是使用Reader.readLine()和Writer.println()来处理socket吧,或者直接使用NIO。

    (注意,SocketOutputStream类在JavaDoc中不存在,只在源码中有,他是个受保护的类。)

  • 光说我的了 ,lz用的是PrintWriter,自己实现了flush,但也是调用内部包装的子对象的,且受autoFlush属性控制,可能跟我的情况不太一样。但可以确定就是flush和\r\n的问题,可以调试一下代码看看。
  • print() 方法等同于 write() 方法

    println() 方法是在 print() 的基础上多调用了一个 newLine() 方法(私有方法)

    而 newLine() 方法会调用 flush()

    所以关键在于 flush()

  • 关键是客户端是
    is.readLine(),println是会自动在字符后面加上回车换行符的,或者你在服务端os.writer("
    一个乱七八糟的字符串\r\n");
     这个根据系统而定。我机器貌似就不支持。
    如果一定要用write()的话,就在加一句printWriter.println()即可。因为newLine()方法是私有的,外部无法直接调用

转载地址:http://zcpwn.baihongyu.com/

你可能感兴趣的文章
非计算机专业本科毕业如何迅速成长为一名算法工程师
查看>>
关于自然语言处理(NLP)的个人学习资料
查看>>
BERT
查看>>
Java keytool生成jks证书,并使用openssl查看公钥信息
查看>>
mysql创建存储过程,set动态赋值
查看>>
【c语言】蓝桥杯算法提高 Quadratic Equation
查看>>
【c语言】蓝桥杯算法提高 输入输出格式练习
查看>>
【c语言】蓝桥杯算法提高 勾股数
查看>>
【c语言】蓝桥杯算法提高 c++_ch02_04
查看>>
【c语言】蓝桥杯算法提高 3-1课后习题2
查看>>
【c语言】蓝桥杯算法提高 3-2求存款
查看>>
【c语言】蓝桥杯算法提高 3-3求圆面积表面积体积
查看>>
【c语言】蓝桥杯算法提高 P0401
查看>>
【c语言】蓝桥杯算法提高 P0402
查看>>
【c语言】蓝桥杯算法提高 三个整数的排序
查看>>
【c语言】蓝桥杯算法提高 P0101
查看>>
【c语言】统计字符次数
查看>>
CTDB原理介绍
查看>>
CTDB配置文件参数解析
查看>>
利用NFS共享搭建CTDB集群
查看>>