print()方法和println()方法的区别_println的用法

print()方法和println()方法的区别_println的用法今天在写一个关于socket的程序,无意间把PrintWriter中的print与println混淆了,于是写了个小demo测试了一下,代码如下:服务端代码:packagecom.city.server;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.PrintWriter;…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

今天在写一个关于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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169301.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java Scanner类的常用方法及用法(很详细)

    Java Scanner类的常用方法及用法(很详细)JavaScanner类的方法及用法(很详细)Scanner类简介Java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除…

    2022年7月7日
    25
  • html制作网页案例代码 大学生_完整html网页代码

    html制作网页案例代码 大学生_完整html网页代码+前言完成一个网页的制作其实本质上是很简单的,本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,采用了有div+css布局。+主题《登录·枫叶》+图摘+目录+代码

    2022年9月23日
    2
  • 23个项目管理经典案例_交互动画

    23个项目管理经典案例_交互动画javaScript动画项目案例示例代码:我的github1.动画库编写匀速运动案例一<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metaname=”viewport”content=”width=device-width,in…

    2022年10月16日
    3
  • 组合数递推的计算方法 c语言,组合数公式的递推公式

    组合数递推的计算方法 c语言,组合数公式的递推公式组合数公式的递推公式:c(m,n)=c(m-1,n-1)+c(m-1,n)。等式左边表示从m个元素中选取n个元素,而等式右边表示这一个过程的另一种实现方法:任意选择m中的某个备选元素为特殊元素,从m中选n个元素可以由此特殊元素的被包含与否分成两类情况,即n个被选择元素包含了特殊元素和n个被选择元素不包含该特殊元素。前者相当于从m-1个元素中选出n-1个元素的组合,即c(m-1,n-1);后者相当于…

    2022年7月15日
    18
  • vue双向绑定失效_vue 跨域

    vue双向绑定失效_vue 跨域v-for渲染一个数组到视图上,对这个数组进行如下操作时会导致双向绑定失败无法在视图上渲染最新的数据:1.对这个数组的数组项整个进行修改Item:[{name:’小王’,age:19,},{name:’小张’,age:22}]this.Item[0]={name:’小K’,age:98}此时发现视图上渲染的第0项是没有改变的,但是打印出来的Item是已经修改到的为什么说整个数组项,如果对数组内对象的某个属性值修改,视图上还是能监听到的2.对这个数组进行添加或删除操作this.Ite

    2025年11月17日
    3
  • hashmap线程不安全问题_arraylist线程不安全体现在哪里

    hashmap线程不安全问题_arraylist线程不安全体现在哪里一、头插法导致死循环在jdk1.7以前,HashMap在进行扩容时采用的是头插法,可能当时别人觉得这样比较高效,但是也带来了线程安全问题。刚开始时HashMap是这样的:正常扩容后是这样的:但如果是在多线程下,两个线程的指向3:此时线程1比线程2先执行,那么线程1就会指向7,将线程7.next指向了3,:但是对于线程2来说,3.next=7;所以就形成了死循环,也就是3和7构成了环。二、数据覆盖在jdk1.8以后,改了1.7以前的小毛病,但是新的问题又来了,我们来看下源码:

    2022年8月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号