广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解决BufferedReader.readLine()遇见的坑
  • 567
分享到

解决BufferedReader.readLine()遇见的坑

2024-04-02 19:04:59 567人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录BufferedReader.readLine()遇见的坑今天踩了这个坑,所以做个笔记所以使用readLine()一定要注意BufferedReader.readLine解析Bu

BufferedReader.readLine()遇见的坑

在写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) { 
		    if (s != null && s.length() > 0)
			return s.toString();
		    else
			return 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解析

bufferedreader.readline()加载流程:


br = new BufferedReader(reader,510241024);//设置缓存大小:5M

根据指定缓存大小,或默认缓存大小,读取文件内容放到缓存中,在将缓存数据放在内存中进行读取,等前一批内存中的数据读取完成后,

下一批缓存数据会放在内存中进行读取;

按行读取时等待读取到换行符返回内容;

注意:以上内容都是自己理解的,仅为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解决BufferedReader.readLine()遇见的坑

本文链接: https://www.lsjlt.com/news/159497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决BufferedReader.readLine()遇见的坑
    目录BufferedReader.readLine()遇见的坑今天踩了这个坑,所以做个笔记所以使用readLine()一定要注意BufferedReader.readLine解析Bu...
    99+
    2022-11-12
  • springcloudoauth2feign遇到的坑及解决
    目录springcloudoauth2feign遇到的坑客户端模式基于springsecurityspringcloud微服务增加oauth2权限后feign调用报null一般是这样...
    99+
    2022-11-13
  • @ConfigurationProperties遇到的坑及解决
    想着偷懒,直接使用@ConfigurationProperties(prefix="xxx")读取配置文件,不使用@Value("${xxx}")去一个一个的注入。 遇到的坑: 创...
    99+
    2022-11-12
  • vue+freemarker中遇到的坑及解决
    目录vue+freemarker遇到的坑在这个过程中遇到了几个坑freemarker的一些坑问题1.对空对象十分敏感2.freemarker中的${}与js中的${}冲突3.渲染数字...
    99+
    2022-11-13
  • 解决SpringBoot整合RocketMQ遇到的坑
    应用场景 在实现RocketMQ消费时,一般会用到@RocketMQMessageListener注解定义Group、Topic以及selectorExpression(数...
    99+
    2022-11-12
  • 解决安装Oracle 11g 遇到的坑
    一.Win10下安装Oracle 11g 报错 信息 [INS-30131] 执行安装程序验证所需的初始设置失败解决:在CMD(管理员身份运行)中使用如下带权限的创建c盘共享命令:net share C$=...
    99+
    2022-10-18
  • 解决springboot整合druid遇到的坑
    springboot整合druid的坑 项目环境 springboot 2.1.6.RELEASE jdk 1.8 pom.xml配置 <?xm...
    99+
    2022-11-12
  • 解决使用openpyxl时遇到的坑
    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时...
    99+
    2022-11-11
  • 解决slf4j 和 logback-classic遇到的坑
    slf4j 和 logback-classic遇到的坑 以前一直不注意日志的打印,最近项目需求需要用日志记录用时性能,集成日志时遇到的问题记录下。 问题一:服务器启动时提示未找到sl...
    99+
    2022-11-12
  • SpringBoot遇到的坑@Qualifier报红的解决
    目录SpringBoot遇到的坑@Qualifier报红解决方法SpringBoot注解@Qualifier用法SpringBoot遇到的坑@Qualifier报红 今天写项目的时候...
    99+
    2022-11-12
  • vue使用mui遇到的坑及解决
    目录使用mui遇到的坑记录mui的js冲突了,有2种解决方法方法1方法2使用mui遇到的坑记录 主要用到webpack打包工具与mui,mint ui,其中mui有不少坑,在此记录 ...
    99+
    2022-11-13
  • 解决@SpringBootTest 单元测试遇到的坑
    目录@SpringBootTest单元测试的坑1、环境2、遇到的问题3、解决方式Test类运行单元测试失效Test测试类无法执行完全问题@SpringBootTest单元测试的坑 1...
    99+
    2022-11-12
  • 解决Spring boot 整合Junit遇到的坑
    目录这是我在使用springboot整合Junit的时候遇到的坑1.在pom.xml中添加junit环境的依赖2.在src/test/java下建立测试类3.自己编写的启动类Spri...
    99+
    2022-11-12
  • springboot连接sqllite遇到的坑及解决
    目录springboot连接sqllite的坑springboot集成sqlite配置设置springboot集成sqlitespringboot连接sqllite的坑 2021-0...
    99+
    2022-11-13
  • SpringBoot测试junit遇到的坑及解决
    目录一、NullPointerException原因解决二、org.springframework.context.ApplicationContextException三、java...
    99+
    2022-11-13
  • MyBatis+MyBatisPlus中遇到的坑怎么解决
    这篇文章主要介绍了MyBatis+MyBatisPlus中遇到的坑怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis+MyBatisPlus中遇到的坑怎么解决文章都会有所收获,下面我们一起来看...
    99+
    2023-07-05
  • Golang中JSON遇到的坑如何解决
    本篇内容主要讲解“Golang中JSON遇到的坑如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang中JSON遇到的坑如何解决”吧!空指针会被解析成字符串"null&qu...
    99+
    2023-07-05
  • uni.uploadFile遇见的坑uploadFile:fail createUploadTask:fail file not found
    uni.uploadFile遇见的坑 这两天用uni.uni.uploadFile遇见个坑上传图片时候一直报错“uploadFile:fail createUploadTask:fail file n...
    99+
    2023-09-20
    微信小程序 小程序
  • 使用SpringBoot的CommandLineRunner遇到的坑及解决
    目录使用场景两个接口的不同特殊的场景遇到的坑填坑总结使用场景 再应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。 Spring Boot中提供了CommandLineR...
    99+
    2023-02-13
    使用SpringBoot CommandLineRunner的坑 SpringBoot CommandLineRunner
  • 使用flutter的showModalBottomSheet遇到的坑及解决
    目录遇到了三个比较坑的地方我们解决完后的效果如下解决问题一解决问题二解决问题三在使用官方的showModalBottomSheet这个组件时到目前为止 遇到了三个比较坑的地方 1. ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作