相关文章推荐
暗恋学妹的鸵鸟  ·  MySQL 8.0 ...·  1 月前    · 
暗恋学妹的鸵鸟  ·  javascript - ...·  5 月前    · 
暗恋学妹的鸵鸟  ·  Debezium MongoDB ...·  10 月前    · 
暗恋学妹的鸵鸟  ·  java.lang.IndexOutOfBo ...·  10 月前    · 
暗恋学妹的鸵鸟  ·  git tag ...·  11 月前    · 
俊逸的炒饭  ·  自訂日期格式 - Tableau·  昨天    · 
长情的充电器  ·  TypeScript+Vue3 - Allis ·  昨天    · 
暴躁的电影票  ·  js循环map ...·  昨天    · 
文雅的弓箭  ·  js循环获取input · ...·  昨天    · 

最近跟一个小伙伴在群里聊天,他说用 readLine 读取网络设备的数据为什么会这么慢?

说实话,平时我们用 BufferedReader 、BufferedWriter 比较多,但是一般是读取文件较多。

Socket socket = new Socket();

socket.bind(new InetSocketAddress("hostname", port));

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

String line = "";

while(true){

line = br.readLine();

if(line == null){

break;

System.out.println(line);

问题是上面的输出很慢,看了上面的代码,有不少的问题,不只是输出慢,程序很有可能卡死在这里。如果优化,应该这样写:

while(null != (line = br.readLine())){

// todo

readLine 有几点需要注意:

1.readLine 方法如果获取不到数据,会一直阻塞,而不是返回 null,除非发生异常或者发送方 close

2.如果数据没有行换符('\n')、回车('\r')、或者('\r\n'),那么 readLine 不会返回,直到缓存满或者文件结尾为止,缓存是 8192 个字符

3.BufferedReader 不适用网络传输

最后,上面慢的原因是,数据没有换行符,回车符,一直到 8192 字符缓存满才返回,所以慢。

 
推荐文章