最近学习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()方法是私有的,外部无法直接调用
     

JAVA printWriter中write()和println()区别的更多相关文章

  1. Java开发中RMI和webservice区别和应用领域

    Java开发中RMI和webservice区别和应用领域 一.RMI和webservice区别和联系 0. 首先,都是远程调用技术. 1. RMI是在TCP协议上传递可序列化的java对象(使用Str ...

  2. 转:PrintWriter中write与println方法的区别

    原文地址:https://blog.csdn.net/qq_25610165/article/details/57083118 自己遇到的问题是:刚开始学 socket 通讯, 代码运行是好着的,后来 ...

  3. java Scanner中next和nextLine()区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. ne ...

  4. 【java基础 15】java代码中“==”和equals的区别

    导读:昨夜闲来无事,和贾姑娘聊了聊java基础,然后就说到了这个"=="和equals的问题,我俩都是以前了解过,也常用这个,但是,昨天说到的时候,又乱了,什么比较地址值,什么判断 ...

  5. java线程中yield(),sleep(),wait()区别详解

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  6. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  7. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  8. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  9. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

随机推荐

  1. vs2012 asp调试设置 清单目录

    在web.cong中添加 <system.webServer> <directoryBrowse enabled="true" /> </system ...

  2. 如何在IDEA中调试 Jar文件

    原创文章,转载请注明出处:http://www.cnblogs.com/acm-bingzi/p/6668333.html   问题: 一般情况下,可以打成Jar包的项目,它的源码运行Applicat ...

  3. Android多渠道打包

    项目需要,简单2步实现(由于简单,所以对大量渠道打包不是最优的),比如1000个渠道同时打包的话可能花费的时间会过长.不过目前该方法能满足绝大需求了...根据截图一步一步走: 第一步 设置配置清单文件 ...

  4. Java基础学习(六)—List

    一.List 1.List集合特有功能 /* * List集合的特有功能: * A:添加功能 * void add(int index,Object element):在指定位置添加元素 * B:获取 ...

  5. linux_cmd_list_0

    一.文件 touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos ...

  6. Spark入门实战

    星星之火,可以燎原 Spark简介 Spark是一个开源的计算框架平台,使用该平台,数据分析程序可自动分发到集群中的不同机器中,以解决大规模数据快速计算的问题,同时它还向上提供一个优雅的编程范式,使得 ...

  7. less补充函数

    1.ceil():向上取整2.floor():向下取整3.percentage():将浮点数转换成百分比3.round():四舍五入4.sqrt():平方根5.abs():绝对值6.pow():乘方运 ...

  8. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  9. 500. Keyboard Row

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...

  10. mybatis面向接口的编程

    一.实现面向接口编程 具体操作方法如下: 第一:编写一个接口(IUser.java) 接口暂时为空接口,接口文件包路径:com.gusi.demo.idao.IUser 第二:修改映射文件(User. ...