必威体育Betway必威体育官网
当前位置:首页 > IT技术

PrintWriter类的println()和writer()方法的一点区别

时间:2019-08-16 18:42:10来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

printwriter

printwriter类的println(String x)方法和writer(Stirng x)方法都表示把输入写到输出流中,但需要注意println()方法会再文本的后面加上分隔符,如windows下为“\r\n”,不同操作系统间有区别。println(String x)的实现在源码中为:

public void println(String x) {
    synchronized (lock) {
        print(x);
        println();
    }
}
其中,println()的源码实现为:newLine();对该方法继续分析发现其实现中包含以下代码out.write(lineSeparator);也就是向输出流中写入一个lineSeparator,继续深入探寻lineSeparator发现该属性在类PrintWriter的构造方法中被赋值为:
lineSeparator = java.security.Accesscontroller.doPrivileged(
    new sun.security.action.GetPropertyAction("line.separator"));
可见该属性与系统相关。
writer(String x)方法的最终实现为: out.write(buf, off, len);
其中buf为字符数组,默认大小为1024,当字符串的长度大于1024时,

将使用字符串的长度作为数组容量,该方法将字符串分解成一个个字符然后写入输出流中,

不会写入分隔符。

综上,当服务器端输出流使用writer(String x)方法时,客户端使用scanner类的hasNextLine()方法和nextLine()方法从输入流中读取数据时,由于nextLine()方法无法读取到行分隔符,该方法将造成阻塞,客户端将不会显示服务器端发来的信息,解决方法:当使用write(String x)时,在字符串后面加上行分隔符“\r\n”,或者使用println(Stirng x)方法。
public class ServerHalfclosed {
    public static void main(String[] args) {
        try(Serversocket serverSocket = new ServerSocket(9000)){
            Socket server = null;
            try {
                server = serverSocket.accept();
                Scanner sc = new Scanner(System.in);
                PrintWriter pw = new PrintWriter(server.getoutputstream());
                String line=null;
                while ((sc.hasNextLine() && !(line = sc.nextLine()).trim().equals("over"))){
                    pw.write(line+"\r\n");
                    //pw.println(line);也可以这样
            pw.flush();
                }
                pw.write(line);
                pw.flush();
                server.shutdownOutput();
                pw.close();
            } finally {
                if(server!=null)
                server.close();
            }
        }catch (IOException e) {
            e.printstacktrace();
        }
    }
}

以上为服务器端代码。

public class ClientHalfClosed {
    public static void main(String[] args) {
        try{
            Socket client =new Socket("localhost",9000);
            Scanner scan = new Scanner(client.getInputStream());
            PrintWriter pw = new PrintWriter(client.getOutputStream());
            System.out.println("客户端连接上:"+client.getLocalPort());
            pw.flush();
            client.shutdownOutput();
            String line=null;
            while (scan.hasNextLine()){
                if(!(line=scan.nextLine()).trim().equals("over"))
                    System.out.println("客户端收到:"+line+"来自服务端:"+client.getInetAddress().getHostAddress());
            }
            System.out.println("客户端收到:"+line+" ,接收完毕!");
            client.shutdownInput();
            pw.close();
            client.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
以上 为客户端代码。


                                    

相关阅读

净推荐值(NPS):用户忠诚度测量的基本原理及方法

文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益。初识NPS作为互联网行业的用户体验从业者,我们都或多

支付宝钱包和支付宝有什么区别?支付宝钱包怎么用?

说到支付宝,相信每个拥有智能机的用户手机里面应该都下载有支付宝,支付宝的功能就不用多说了吧,出门不带钱全靠支付宝,不管你是超市买

fidder抓包工具使用方法,完整流程

附:下面流程走完以后,可以参考视频教程:https://www.imooc.com/learn/37 一、百度搜索”fiddler 下载“ ,安装最新版本     下

十大方法全解析,轻松玩转促销活动

提到如何做促销,可能很多人最先想到的就是降价,但其实,还有很多方法都可以用。今天打开微博,看到这么一条热搜:#GUCCI降价#评论区引起

支付宝账单里等待付款怎么取消?两种方法介绍

现在的支付方式中,支付宝是比较的受欢迎的,很多的用户们都会采取这样的方式去付款,如果支付宝账单里面有待支付的订单,自己不想付了,支

分享到:

栏目导航

推荐阅读

热门阅读