在写ftp上传文件至服务器的过程中,有这样一个判断:判断某个文件夹下有多少个文件,内容为null的文件不上传,所以利用BufferedReader读取文件的内容,判断是否为null,所以用到了BufferedReader.readLine(),结果竟然卡死:txt、word、Excle、Ftp文件等都没有问题,但是读取MP3、Rar、zip等文件时,就一直处于卡死状态,先看代码:

package com.test;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;public class TestCh {public void readDocFileToFtp() {String docPath = "H:\\11"; // 文件所在路径 模拟File file;try {file = new File(docPath);File[] files = file.listFiles();if (files.length == 0) {System.err.println(docPath + "文件夹下没有任何文件!");} else {Arrays.sort(files);System.err.println("文件数---" + files.length);for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {InputStreamReader reader;reader = new InputStreamReader(new FileInputStream(files[i]));BufferedReader br = new BufferedReader(reader);String message = "";String line = "";long startTime = System.currentTimeMillis(); // 获取开始时间while ((line = br.readLine()) != null) {message += line;}br.close();long endTime = System.currentTimeMillis(); // 获取结束时间System.out.println("程序运行时间: " + (endTime - startTime) / 1000 + "ms");String fileName = files[i].getName();if (message.trim() == null || message.length() == 0) {System.err.println(fileName + "文件内容为空!");} else {// 上传文件System.err.println("上传===============");}}}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {TestCh te = new TestCh();te.readDocFileToFtp();}}

然后一直卡死:

我们都知道,readLine()方法是遇到换行符或者是对应流的结束符,该方法才会认为读到了一行(才会结束其阻塞),让程序继续往下执行。但可能因为以前不留意,也没遇见过这种情况,所以就认为该方法可放心使用,今天踩了这个坑,所以做个笔记:
我们可能下意识地认为readLine()读取到没有数据时就返回null(因为read()方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null。

readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。

如果不指定buffer大小,则readLine()使用的buffer有8192个字符。

在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。

String readLine(boolean ignoreLF) throws IOException {StringBuffer s = null;int startChar;synchronized (lock) {ensureOpen();boolean omitLF = ignoreLF || skipLF;bufferLoop:for (;;) {if (nextChar >= nChars)fill(); //在此读数据if (nextChar >= nChars) { /* EOF */if (s != null && s.length() > 0)return s.toString();elsereturn null;}......//其它
}private void fill() throws IOException {..../其它int n;do {n = in.read(cb, dst, cb.length - dst); //实质} while (n == 0);if (n > 0) {nChars = dst + n;nextChar = dst;}}

通过查看源码可知,readLine()是调用了read(char[] cbuf, int off, int len) 来读取数据,后面再根据"/r"或"/n"来进行数据处理,所以使用readLine()一定要注意:

1.读入的数据要注意有/r或/n或/r/n

2.没有数据时会阻塞,在数据流异常或断开时才会返回null

3.非必要时(socket之类的数据流),要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞

BufferedReader.readLine()遇见的坑相关推荐

  1. BufferedReader.readLine()的坑

    今天在跟朋友讨论实现服务器和客户端一对一通信的时候,客户端给服务器发送第一条数据无异常,接着服务器给客户端回数据的时候,怎么着客户端也收不到服务器的数据,调试后发现原来是卡在服务端的readLine( ...

  2. java编写socket使用bufferedReader.readLine()问题研究

    不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下. 客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函 ...

  3. bufferedreader.readline()解析

    bufferedreader.readline()加载流程: br = new BufferedReader(reader,510241024);//设置缓存大小:5M 根据指定缓存大小,或默认缓存大 ...

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

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

  5. gogoprotobuf在windows上遇见的坑

    gogoprotobuf在windows上遇见的坑 闲话一下 准备工作 创建你的工程目录 生成go文件 我们还想要更简洁的代码 总结 闲话一下 最近打算做一个联网的小游戏,通讯协议决定使用protob ...

  6. Nuxt3遇见的坑(四):图片动态渲染之后打包路径问题以及打包css样式问题

    Nuxt3遇见的坑(四):图片动态渲染之后打包路径问题以及打包css样式问题 图片问题 我官网有个组件是非常多的图片,大概有40多张吧,那我肯定不能一张一张去写一个img,所以我用了v-for去循环渲 ...

  7. java readline 超时_跳过Java中的BufferedReader readLine()方法

    是否有一种简单的方法可以跳过java中的readLine()方法(如果它花费的时间超过2秒)? 这是我问这个问题的背景: public void run() { boolean looping = t ...

  8. mac gcc安装_16_超级小白Mac Pro下安装superset遇见的坑

    开始数据分析工作2个月了,Leader让我把昨天下午遇见的superset坑写个文档,就更新在这儿吧. Superset Superset是一款轻量级的BI工具,由Airbnb的数据部门开源.整个项目 ...

  9. 解决 java BufferedReader.readLine()方法按行读取文件内容中文乱码的问题

    原来的代码如下所示,但是输出的内容都是乱码 public void readLine(String path) {InputStreamReader isr = null;BufferedReader ...

最新文章

  1. 如何在vsc上选择远程miniconda特定的虚拟环境中的Python解释器(4步)
  2. 学python需要英语基础吗-英语基础一般,如何才能学习C语言编程和Python
  3. flex内根据id(string)获取对象
  4. iostat命令(转)
  5. java soap envelope_如何在SOAP请求中关闭Envelope和Body
  6. 新的编程语言研发契机思考
  7. 过了一个有意义的愚人节
  8. shiro、cas、pac4j 实现单点登陆
  9. AS3的Vector的初始化
  10. Spring-beans-BeanDefinitionReader
  11. hadoop hdfs空间满后重新启动不了
  12. 珍大户《认知世界的经济学》学习笔记,更新时间 2021年01月30日22:34:35
  13. 【电子技术实验设计】简易水位控制器设计报告
  14. 如何通过WebEx Meeting进行远程IT协作?
  15. 如何做系列(5)-james mail安装总结
  16. 关于SIGHUP信号的讨论
  17. protoc protoc-gen-go安装
  18. matlab 两个txt文件的合并。。
  19. python变量名可以用下划线开头吗_python以下划线开头的变量和函数的作用
  20. OllyDBG破解入门教程[图文]教程

热门文章

  1. 如何避免野指针的情况出现!
  2. MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动
  3. svn sqlite database disk image is malformed
  4. 【OpenGL ES】入门及绘制一个三角形
  5. 如何从神品屋下载废柴道士2并放入kindle
  6. [爬虫] 爬取高德地图的面状数据存为shp - 公园数据为例
  7. Linux清理缓存命令
  8. python关闭当前窗口_PyQt5每天必学之关闭窗口
  9. WebRTC:下载与编译Android版本的WebRTC(M66)
  10. c语言中左移、右移要注意的细节