• JAVA BufferedReader 类从标准输入读取数据


    1,从标准输入上建立输入流:

    BufferedReader localReader = new BufferedReader(
                        new InputStreamReader(System.in));

    System.in 表示标准输入,一般指键盘。

    建立输入流,从标准输入读取数据到缓冲区中。

    当在标准输入中输入一行字符串时,按回车之后,这行数据就会被读取到缓冲区中。

    比如: abc  (表示按下回车键)

    那么msg就会赋值为 abc

    String msg = null;
    while ((msg = localReader.readLine()) != null) {
        System.out.println(msg);//打印从标准输入读取到的数据
        process(msg);          
        if (msg.equals("bye"))//当输入 bye 时 结束
            break;
        }                    

     BufferedReader 使用 readLine方法读取数据时,每次读取一行。以回车换行标记一行数据的结束。

    使用if语句来判断用户是否在标准输入中输入了bye。若输入了bye之后,就跳出while循环。若没有if语句,while循环就不会终止。

    2,从Java的 InputStream中建立输入流

    从InputStream中输入与从键盘输入是有区别的,InputStream流可以关闭(异常关闭或正常关闭),而对于键盘而言,没有关闭的概念,只要你从键盘敲入字符并按回车就会输入一行字符。

    下面是从Socket的输入流中建立起BufferedReader的输入:

    BufferedReader localReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));

    在此种情况下,当使用while( (str = localReader.readLine()) != null )读取数据时,何时才能读取完毕跳出while循环呢?

    一种方法是与 1 中讨论的一样,使用一个标记字符串,如"bye",具体解释看上面。

    另一种方法是:因为本例是从Socket的InputStream中读入数据的,因此当Socket的发送端发完数据后并关闭了Socket,那么接收端就会读入发送端的数据。当接收端再读数据时,readLine()就会返回null。此时会跳出while。(若发送端没有关闭Socket,接收端再读数据时,就会阻塞等待发送端再发送数据过来。若发送端关闭了Socket,接收端再读数据时,就会返回null)

    综上所述,当在while循环中使用BufferedReader的readLine方法时,while循环退出的条件是:

    a)在while循环中使用 if 判断 结束的标记字符串(如 "bye"),使用break 跳出while,

    b)若是建立的Socket连接、或者其他InputStream流的输入。当发送方关闭了流时,readLine方法再次读取时会读到 null 值。这样也就跳出了while。

    注意如果是写数据时,记得flush一下。

  • 相关阅读:
    gitlab11.5.4 配置邮件提醒
    docker 安装 mongodb
    dd测试
    k8s部署rocketmq 双主
    rocketmq 多master集群部署
    Kubernetes中的Taint污点和Toleration容忍
    Zookeeper分布式集群搭建
    初识ZooKeeper
    hdu 5071(2014鞍山现场赛B题,大模拟)
    hdu 5073
  • 原文地址:https://www.cnblogs.com/hapjin/p/5001774.html
Copyright © 2020-2023  润新知