JAVA printWriter中write()和println()区别
最近学习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()区别的更多相关文章
- Java开发中RMI和webservice区别和应用领域
Java开发中RMI和webservice区别和应用领域 一.RMI和webservice区别和联系 0. 首先,都是远程调用技术. 1. RMI是在TCP协议上传递可序列化的java对象(使用Str ...
- 转:PrintWriter中write与println方法的区别
原文地址:https://blog.csdn.net/qq_25610165/article/details/57083118 自己遇到的问题是:刚开始学 socket 通讯, 代码运行是好着的,后来 ...
- java Scanner中next和nextLine()区别
next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. ne ...
- 【java基础 15】java代码中“==”和equals的区别
导读:昨夜闲来无事,和贾姑娘聊了聊java基础,然后就说到了这个"=="和equals的问题,我俩都是以前了解过,也常用这个,但是,昨天说到的时候,又乱了,什么比较地址值,什么判断 ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
随机推荐
- 【转】JavaScript中使用ActiveXObject操作本地文件夹的方法
原文链接:http://www.jb51.net/article/48538.htm
- Java内存泄露实例
- C++ 虚函数相关,从头到尾捋一遍
众所周知,C++虚函数是一大难点,也是面试过程中必考部分.此次,从虚函数的相关概念.虚函数表.纯虚函数.再到虚继承等等跟虚函数相关部分,做一个比较细致的整理和复习. 虚函数 OOP的核心思想是多态性( ...
- 性能测试培训:批量执行Jmeter脚本之ant调用
性能测试培训:批量执行Jmeter脚本之ant调用 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的load ...
- android开发用无线网络进行Android开发中的调试
1.手机具有root权限 2.安装adbWireless1.5.4.apk (下面有下载地址) 3.敲入命令:adb connect 192.168.1.127 后面是手机的IP地址 打开eclip ...
- 实用开发之-oracle表回滚到一个指定时间的操作语句
在开发或客户使用过程中,难免会出现误操作或脏数据,那么怎么迅速处理这个问题呢? 1.备份还原就用了,太麻烦. 就是使用ORACLE的备份功能,然后在还原,还原的时候新建一个库,然后使用dblink进行 ...
- 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控
如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...
- 01 The Learning Problem
什么时候适合用机器学习算法? 1.存在某种规则/模式,能够使性能提升,比如准确率: 2.这种规则难以程序化定义,人难以给出准确定义: 3.存在能够反映这种规则的资料. 所以,机器学习就是设计算法A,从 ...
- 初步了解关于js跨域问题
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- 移动端emoji图标的存储和显示
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6694595.html 一.emoji是什么 绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的 ...