• readLine()的注意点


    链接:https:////www.cnblogs.com/tangZH/p/7837992.html

    更多精彩链接:http://77blogs.com/?p=142

    我在用socket做即时通讯的时候,读取服务器返回的信息用了BufferedReader,用起来挺方便的。

    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line ;
    while ((line = br.readLine())!=null){
    }
    readLine()用起来很方便,每次都是返回一行。
    不过该方法有许多值得注意的地方:

    一、网络模式:
    1、
    在网络上,readLine()是阻塞模式,也就是说如果readLine()读取不到数据的话,会一直阻塞,而不是返回null,所以如果你想要在while循环后执形相关操作是不可能的,因为while()里面是一个
    死循环,一旦读不到数据,它又开始阻塞,因此永远也无法执形while()循环外面的操作,所以应该把操作放在while循环里面。(在我做的即时通讯里,为了能够不断获取服务器返回的消息,就是用这种方法,不断去服务器获取消息
    ,一旦有就返回。)

    2、
    在while()里面判断readLine()!= null的时候要赋值给一个String,因为如果不为null,那么这时候已经读了一行。如果用while (br.readLine()!=null),那么下面没法再获取到这一行,所以应该用
    while ((line = br.readLine())!=null){}

    3、readLine()通过下列字符之一即可认为某行已终止:换行 (' ')、回车 (' ') 或回车后直接跟着换行,所以我们在发送数据的时候要再后面加上这些标志符,否则程序会阻塞。而我是直接用下面这种方法:
    PrintStream ps = new PrintStream(socket.getOutputStream(), true, "UTF-8");
    ps.println()。
    ps.println()已经包含换行了,所以不要用print(),若是要就要在后面加上换行符;
     
    4、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。

    二、读取文件模式:
    1、readLine()什么时候才会返回null呢?读取到文件等的结尾时候。(注意和网络上的是不一样的)。

    • 如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
  • 相关阅读:
    cuda实践2
    对旋转矩阵R做(行)初等变换会发生什么?
    关于最短路径问题:Dijkstra与Floyd算法
    深入理解JavaScript系列
    jquery的$.extend和$.fn.extend作用及区别
    知道WCF的地址用工厂通道方式快速调用WCF
    WCF大数据量传输解决方案
    系统上线后WCF服务最近经常死掉的原因分析总结
    Microsoft Web Application Stress Tool 使用
    标识符解析在闭包中理解
  • 原文地址:https://www.cnblogs.com/tangZH/p/7837992.html
Copyright © 2020-2023  润新知