JAVA printWriter中write()和println()区别

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

时间: 2024-10-25 09:49:59

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

JAVA集中中 List Set Map 区别和关系

1List:List元素的特点!     List集合的遍历方式:         while-迭代器遍历         for-迭代器遍历         foreach-迭代遍历         for-get遍历(只有List才可以,set,map都不可以) 有序可重复,因为底层的实现数组和链表,都是有下标来表示唯一性的,存进去什么顺序,取出来还是什么顺序. ArrayList : 底层是一个索引数组,有顺序的,靠索引数组的下标 LinkedList: 底层是一个链表式的先后维持顺序.

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置.货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值.由于小数点位置固定,所以可以直接用四位数值来表达相应的数值.SQL 中的 NUMBER 数据类型就是利用定点数来定义的.还有一种提议的表达方式为有理数表达方式,

java中的system.out.println()和JSP中out.println()区别

out.println()输出到客户端.     在out.println()中,out是response的实例,是以response为对象进行流输出的,即将内容输出到客户端.如果在JSP页面中使用System.out.println(),在客户端只会输出一个空格. System.out.println()打印在控制台当中.     System.out.println()用的是标准输出流,这个是输出在控制台上的,而JSP不是控制台程序.不管是在JSP还是在JAVA程序中,System.out.

java中ArrayList 、LinkList区别

转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.LinkedList,但是最好的方式还是看源代码.其实ArrayList就是一个动态数组,LinkedList是一个链表.  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.     2.对于随机访问get和set,ArrayList优于LinkedLis

hadoop中Text类 与 java中String类的区别

hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.例如 unicode就是一个字符集,它的目标是涵盖世界上所有国家的文字和符号: 字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对.即在符号集

【转】Java中equals和==的区别

[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,

java中==与equel的区别

转载自:http://xiashengchao.iteye.com/blog/753409 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同. ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为t

Java中的==和equals区别

引言:从一个朋友的blog转过来的,里面解决了两个困扰我很久的问题.很有久旱逢甘霖的感觉. 中软国际电子政务部Jeff Chi总结,转载请说明出处. 概述:        A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.        B.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的.        C.基本类型没有equals方法,equals只比较值(对象中的

java中==与equals的区别

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同. ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 一.String中的equals和== 1. public