返回顶部
首页 > 资讯 > 后端开发 > Python >基于bufferedreader的read()与readline()读取出错原因及解决
  • 599
分享到

基于bufferedreader的read()与readline()读取出错原因及解决

2024-04-02 19:04:59 599人浏览 安东尼

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

摘要

目录bufferedreader的read()与readline()读取出错bufferedReader中的readLine()源码解析bufferedreader的read()与r

bufferedreader的read()与readline()读取出错

以前学习java的时候也没有太在意,直到最近做项目时使用了才发现这个问题,总是第一个字符输不出来

bufferedreader这个类借用别人的话来说,就是一个包装类

它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提高读的效率而设计的。

读取一个txt文件,方法很多种而我使用的是字符流来读取


int c; 
FileReader file = new FileReader("D:\\emDemo.java");
   BufferedReader br = new BufferedReader(file);
   while((c=br.read())!=-1){undefined
    System.out.println(br.readLine());
   }

发现每行的第一个字符都没有显示出来,后来发现 c=br.read())!=-1 每次都会先读取一个字节出来,所以后面的br.readLine());

读取的就是每行少一个字节

所以,应该使用


String input = null;
   while ((input=br.readLine())!=null){undefined
    System.out.println(input);
   }

这样就能解决了~

bufferedReader中的readLine()源码解析


String readLine(boolean ignoreLF) throws ioException {
		//行(hang)数据的缓冲s
		StringBuffer s = null;
		int startChar;
 
	        synchronized (lock) {
	       
	            ensureOpen();
	            
	          
		    boolean omitLF = ignoreLF || skipLF;
 
		 	
		    bufferLoop:
		    for (;;) {
		    	
		    	//1、如果缓冲数组的数据不足,或者已经读到了数组的末尾时:
		    	//1.1如果下次读取的位置已经到了or超过数组的长度,从流中读数据到缓冲数组cb中
			if (nextChar >= nChars)
			    fill();
			
			if (nextChar >= nChars) { 
			    if (s != null && s.length() > 0)
				return s.toString();
			    else
				return null;
			}
			
			
			//2 缓冲数组中有足够的数据时:
			
			boolean eol = false;
			char c = 0;
			int i;
 
			if (omitLF && (cb[nextChar] == '\n')) 
	                    nextChar++;
			skipLF = false;
			omitLF = false;
 
		    charLoop:
			for (i = nextChar; i < nChars; i++) {
			    c = cb[i];
			    if ((c == '\n') || (c == '\r')) {
				eol = true;
				break charLoop;
			    }
			}
			
			
			startChar = nextChar;
			nextChar = i;
			if (eol) {
			    String str;
			    
			    if (s == null)
			    {
				str = new String(cb, startChar, i - startChar);
			    } 
			    
			    else
			    {
				s.append(cb, startChar, i - startChar);
				str = s.toString();
			    }
			  //更新下次读取的位置
			    nextChar++;
			    if (c == '\r') {
				skipLF = true;
			    }
			    return str;
			}
			//2.2如果没有换行符
			if (s == null) 
				//类属性int defaultExpectedLineLength = 80
			    s = new StringBuffer(defaultExpectedLineLength);
			//填充s,从上个换行符到最后
			s.append(cb, startChar, i - startChar);
		    }
	        }
	    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 基于bufferedreader的read()与readline()读取出错原因及解决

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

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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作