今天在写一个关于socket的程序,无意间把PrintWriter中的print与println混淆了,于是写了个小demo测试了一下,代码如下:
服务端代码:

package com.city.server;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class CityServer {public static void main(String [] args){    ServerSocket serverSocket=null;Socket socket=null;int port=9999;try {System.out.println("准备启动服务......");serverSocket=new ServerSocket(port);socket=serverSocket.accept();BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter ps=new PrintWriter(socket.getOutputStream(),true);String b=br.readLine();System.out.println("客户端发送的消息:"+b);System.out.println("服务器准备返回信息!");System.out.println("返回信息时:我是服务器!");ps.println("我是服务器!");//ps.print("我是服务器! \n");//ps.flush();System.out.println("----------------------");} catch (Exception e) {// TODO: handle exception}   }
}

客户端代码:

package com.city.client;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;public class CityClient {public static void main(String[] args) {Socket socket=null;int port=9999;try {System.out.println("准备启动客户端......");socket=new Socket(InetAddress.getLocalHost(), port);PrintWriter ps=new PrintWriter(socket.getOutputStream(),true);BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg="你好,我是客户端!";ps.println(msg);//ps.print(msg+"\n");//ps.flush();String b=br.readLine();System.out.println("服务器返回消息:"+b);       } catch (Exception e) {// TODO: handle exception}}
}

以上代码执行结果为:
服务端结果
客户端结果
把上列程序中的服务端的
ps.println("我是服务器!");修改为ps.print("我是服务器!");
然后执行!结果如下:
服务端结果:
客户端结果:
然后把修改的代码注释掉,打开服务端以前注释掉的部分,执行结果与第一次相同。那为什么呢?通过百度之后,并对比print与println源码,现总结如下:
printwriter如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
此外,在println中,已经调用过flush()方法,源代码如下:

 public void println() {newLine();}private void newLine() {try {synchronized (lock) {ensureOpen();out.write(lineSeparator);if (autoFlush)//这里就调用了flush()方法out.flush();}}catch (InterruptedIOException x) {Thread.currentThread().interrupt();}catch (IOException x) {trouble = true;}}

在print中则没有,源代码如下:

 public void print(String s) {if (s == null) {s = "null";}write(s);}

所以,在使用print方法的时候必须在发送的数据后面添加”\n”换行符标识以及在后面要调用flush()方法。

文章转载自: https://blog.csdn.net/qq_29306775/article/details/52242033

关于PrintWriter中的print与println方法的区别相关推荐

  1. PrintWriter中的write与println方法居然就是这些区别

    为什么循环中分别用write方法和println方法效果一样呢? 1 import java.io.*; 2 3 public class WriteLog { 4 5 private Buffere ...

  2. java println和print_java中的print和println有区别吗

    java中的print和println有区别吗 发布时间:2020-07-01 11:55:01 来源:亿速云 阅读:118 作者:Leah java中的print和println有区别吗?针对这个问 ...

  3. Java学习笔记1:Java中有关print、println、printf的用法和区别

    Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...

  4. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  5. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  6. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  7. android add fragment,fragment中的add和replace方法的区别浅析

    使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑. 我觉得使用 add 的话,在按返回键应该是回退到 ...

  8. PrintWriter write与println方法的区别

    PrintWriter在以下以pw代替,在写client与server进行测试的通讯程序时,用pw.println(str)可以把数据发送给客户端,而pw.write(str)却不行! 查看源码发现: ...

  9. Cesium 中两种添加 model 方法的区别

    概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

最新文章

  1. python输入文字如何定义文字_python如何实现手动输入文字
  2. HDU 1251(trie树)
  3. 文本编辑器实现关于对话框的功能
  4. kibana操作elasticsearch:创建索引库
  5. 获取extjs 选择后的表头_批量写入审计底稿的表头信息设定页面
  6. OOD面向对象设计浅谈
  7. 群晖按装mysql_如何连接群晖里的MYSQL数据库
  8. nodepad++快捷键收集
  9. kux格式怎么转换成mp3_怎么快速无损地把视频转换成mp3格式?三种方法了解一下吗?...
  10. 米酷影视v7.2.1影视电影网站管理系统源码修复版
  11. 医院信息化集成平台建设
  12. 多个jdk配置环境变量
  13. 网站流量分析的整体思路(大数据)
  14. 2008年世界各国最新GDP排名
  15. 视频教程-【吴刚大讲堂】电商品牌文案设计方法-电子商务
  16. 我在国企做软件开发这4年。。
  17. linux xmapp的安装
  18. 微星z370黑苹果_微星Z370 KRAIT GAMING主板搭配I7-8700K N卡GTX 1060安装黑苹果注意事项...
  19. ue4 怎么传递变量到另一个蓝图_【UE4】UI注意事项
  20. 民用飞机着陆阶段着陆方法_着陆区第二部分的解剖

热门文章

  1. 《Adobe Premiere Pro视频编辑指南(第2版)》——监视和采集方案
  2. 充值系列—充值系统数据库设计(一)
  3. [问题解决]解决编译时,Androidx和其他三方库冲突
  4. 寻仙显示你与聊天服务器断开连接,新寻仙
  5. Linux 入门级 常用命令 日常记录
  6. Node.js 学习 ——nodemon 运行报错解决
  7. Spring的事件机制
  8. 文件绑定java socket多线程网络传输多个文件Strut2教程-java教程
  9. php微信公众号开发,获取用户头像,并下载;
  10. 特色社会之怪现状 (转载)