BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用socket.close()关闭不需要的socket.

  虽然写IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用过好几次的,原因是:

  它有一个很特别的方法:readLine(),使用起来特别方便,每次读回来的都是一行,省了很多手动拼接buffer的琐碎;

  它比较高效,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/InputStream包起来,使得读取数据更高效。

  对于文件来说,经常遇到一行一行的,特别相符情景。

  这次是在蓝牙开发时,使用两个蓝牙互相传数据(即一个发一个收),bluecove这个开源组件已经把数据读取都封装成InputStream了,也就相当于平时的IO读取了,很自然就使用起readLine()来了。

  发数据:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(conn.openOutputStream()));
int i = 1;
String message = "message " + i;
while(isRunning) {  output.write(message+"/n");   i++;
} 

  读数据:

BufferedReader input = new BufferedReader(new  InputStreamReader(m_conn.openInputStream()));
String message = "";
String line = null;
while((line = m_input.readLine()) != null) {  message += line;
}
System.out.println(message); 

  上面是代码的节选,使用这段代码会发现写数据时每次都成功,而读数据侧却一直没有数据输出(除非把流关掉)。经过折腾,原来这里面有几个大问题需要理解:

  • 误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null;因为readLine()阻塞后,System.out.println(message)这句根本就不会执行到,所以在接收端就不会有东西输出。要想执行到System.out.println(message),一个办法是发送完数据后就关掉流,这样readLine()结束阻塞状态,而能够得到正确的结果,但显然不能传一行就关一次数据流;另外一个办法是把System.out.println(message)放到while循环体内就可以。
  • readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
  • 如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。

小结,使用readLine()一定要注意:

  1. 读入的数据要注意有/r或/n或/r/n
  2. 没有数据时会阻塞,在数据流异常或断开时才会返回null
  3. 使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞

正确读取Socket InputStream 的方法

package com.photoManage.utils;import java.io.*;  public class StreamTool {     public static void main(String[] args) {  try {  File file = new File("C:\\demo.log");  FileInputStream fin = new FileInputStream(file);  byte[] filebt = readStream(fin);  System.out.println(filebt.length);  } catch (Exception e) {  e.printStackTrace();  }     }/** * @功能 读取流 * @param inStream * @return 字节数组 * @throws Exception */  public static byte[] readStream(InputStream inStream) throws Exception {  int count = 0;while (count == 0) {count = inStream.available();}byte[] b = new byte[count];inStream.read(b);return b; }
}  

(转自 程序人生0407)

关于BufferedReader的read()及readLine()相关推荐

  1. java中readline函数_自定义BufferedReader中read和readLine方法

    BufferedReader中read和readLine方法总结 实例如下所示: package day0208; import java.io.FileReader; import java.io. ...

  2. 关于java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  3. java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  4. 关于bufferedreader的read()与readline()读取出错的原因

    以前学习java的时候也没有太在意,直到最近做项目时使用了才发现这个问题,总是第一个字符输不出来 bufferedreader这个类借用别人的话来说,就是一个包装类 它可以包装字符流,将字符流放入缓存 ...

  5. BufferedReader.readLine()读取文件第一行会出现bug,首行第一个字符会是一个空字符

    BufferedReader.readLine()读取第一行会出现bug,首行第一个字符会是一个空字符 BufferedReader is =new BufferedReader(new InputS ...

  6. java中的reader_java中BufferedReader 有什么用

    这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的. BufferedReader buffer ...

  7. 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri

     模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...

  8. 自己实现java I/O中的BufferedReader对象中的raedLine方法

    import java.io.*; /* readLine方法的原理是将除回车符以外的字符全部存储到一个字符数组中(本例中用StringBuilder代替),等到读完一行后将其返回 自己编写一个Buf ...

  9. Java IO(五)——字符流进阶及BufferedWriter、BufferedReader

    一.字符流和字节流的区别 拿一下上一篇文章的例子: 复制代码 复制代码 1 package com.demo.io; 2 3 import java.io.File; 4 import java.io ...

最新文章

  1. 导师会指导改matlab程序吗,导师指导记录.docx
  2. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)
  3. 关于Java基础需要注意的点
  4. 友友企业地图(Enterprise MAP)
  5. TCP/IP / TCP 头
  6. 从centos7默认安装的/home中转移至根目录/ (LVM操作简明教程)
  7. 程序媛计划——python数据库
  8. 卡尔曼滤波—建立状态空间表达式
  9. python uwsgi_python nginx+uwsgi+WSGI 处理请求详解
  10. C++ STL 源码剖析之 Traits 编程技法
  11. 内网远程控制安卓设备软件推荐
  12. 概率论基础(2)条件概率、全概率公式和贝叶斯公式
  13. 计算机 电脑 整机 加密,如何加密文件夹
  14. 微星ZH77A-G43老主板加持SSD 成功!
  15. win10系统如何删除不用的输入法
  16. 花与剑尚未获取服务器信息,花与剑澄心无忆攻略,触发条件及完成方式介绍
  17. 锐捷路由器如何配置虚拟服务器,[路由器自动配置方法技巧] 锐捷路由器配置方法...
  18. 2022帆软BI数据分析大赛强势来袭,瓜分20W奖金
  19. 如鹏java学习进程 将输入的正整数相加,ok结尾
  20. 图像互信息(MI)的计算(Python版本)

热门文章

  1. Keras深度学习实战(38)——图像字幕生成
  2. 如何成为一个程序员高手
  3. 计算机学校起名网,最新微信网名校园系列
  4. Oracle学习——表空间管理(二)
  5. Oracle的ONS创建,Oracle中的ONS
  6. 解决:‘npm’不是内部命令或外部命令,也不是可运行的程序。npm ERR! code ELIFECYCLE npm ERR! errno 1
  7. 学生选修课程系统(C语言/C++实现)
  8. 广东计算机专插本有哪些学校,广东专插本学校有哪些
  9. cf D. Vessels
  10. 【算法学习笔记五】平摊分析