Java之IO(十一)BufferedReader和BufferedWriter
转载请注明源出处:http://www.cnblogs.com/lighten/p/7074488.html
1.前言
按照字节流的顺序一样,字符流也提供了缓冲字符流,与字节流不同,Java虽然提供了FilterReader和FilterWriter类,但是缓冲字符流没有继承者两个类,而是直接继承了Reader和Writer类。
2.BufferedReader

构造函数接受一个Reader和一个缓冲字符数量,默认8192。

read方法不但使用了同步锁,还采取了for(;;)形式。nextChar是要读取的字符位置下标,nChars是当前缓存中字符数量。很显然,要读取的字符下标大于等于当前存在的字符,意味着缓存中的字符已经被读取完了,需要重新获取写入缓存。这个就是fill()方法。fill()之后还是没有,就意味着读取完了,返回-1。skipLF是否跳过换号符,默认false。然后就是返回位置为nextChar的cb字符数组的字符,自增1。

fill()方法需要考虑到mark方法产生的标记,有标记和无标记的情况是不同的,无标记的时候肯定就是buffer被使用完了,从0开始重新填数据。也就是最后一段了。有标记的时候就不能舍弃标记的数据了,所有需要计算dst的值,由于存在readAheanLimit参数所以mark的计算又有区别。这个参数的意思是重置标记的时候,之前读取过的数据最多出现多少。因此,fill方法计算了标记位到已读取完的长度,如果大于这个限制,这就是一个无效的标记(标记在1号位,读完到5号位,但只能出现两个历史字符readAheanLimit,这样标记位就没有用了,因为不能删除后面多余的字符吧,所以是一个无效标记)。有效标记又分为两种情况,一种是readAheanLimit小于当前缓存大小,这个就不要紧,拷贝从标记为开始的数据就可以了。标记为置为0,新数据要从delta开始写了。如果大于缓存,肯定就是重新创建缓存了。

read字符数组的方法也是一个常见的处理过程了,先执行一次,如果都完了就直接返回了,如果没读完,且没有读到需要的数量就通过while循环不断读,读完了流就直接break,或者读到所需的len长度。

如果没有可读的缓存了当然要重新fill,但是这里也有一种情况,就是所要的长度超过缓存大小,这个时候就直接从原来的流中读取返回。重填了之后还是没有,就是读取完了,返回-1。后面就是把数据填充到给的字符数组了,可能缓冲区的数据不够,所以是选择了小的那个值,然后返回。
其它的方法没上面好讲的了。最后的一个lines方法,是JDK8才提供的,具体实现超过IO的范畴,作用是返回一个Stream<String>,里面就是所读取的流的一行行,懒加载的方式。
3.BufferedWriter
相比于BufferedReader,输出流BufferWriter较简单些。

一样接收一个Writer和缓存大小,默认也是8192个字符。

write方法,如果缓存写满了就刷入持有的writer。然后重置nextChar为0,写入当前的这个位置。

里面自己写了一个比较方法,而没有使用Math类的方法,理由上面也给了,使用完了文件描述符的时候,会尝试打印堆栈跟踪。
其它两个write方法都比较简单,思路一样,就不再继续介绍了。
Java之IO(十一)BufferedReader和BufferedWriter的更多相关文章
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...
- Java IO--字符流--BufferedReader和BufferedWriter
从昨天开始没事情干时,决定梳理梳理Java IO流,因为觉得太混乱这个东西,妈的,咋就这么多类型,想累死谁啊,这里并不是埋怨创造者,而是气自己看着看着老跑偏,实在看不进去,太多了,想睡觉,所以现在决定 ...
- java Socket通信使用BufferedReader和BufferedWriter的注意事项
注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...
- Java之IO(零)总结
转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...
- java中OutputStream字节流与字符流InputStreamReader 每一种基本IO流BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWriter,FileInputStream,FileReader,FileWriter,InputStr
BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWri ...
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- Java IO(十八) BufferedReader 和 BufferedWriter
Java IO(十八) BufferedReader 和 BufferedWriter 一.介绍 BufferedReader 和 BufferedWriter 是字符缓冲流,分别继承自 Reader ...
- 通过源码学Java基础:BufferedReader和BufferedWriter
准备写一系列Java基础文章,先拿Java.io下手,今天聊一聊BufferedReader和BufferedWriter BufferedReader BufferedReader继承Writer, ...
随机推荐
- HDU 5618 Jam's problem again (cdq分治+BIT 或 树状数组套Treap)
题意:给n个点,求每一个点的满足 x y z 都小于等于它的其他点的个数. 析:三维的,第一维直接排序就好按下标来,第二维按值来,第三维用数状数组维即可. 代码如下: cdq 分治: #pragma ...
- HDU 5957 Query on a graph (拓扑 + bfs序 + 树剖 + 线段树)
题意:一个图有n个点,n条边,定义D(u,v)为u到v的距离,S(u,k)为所有D(u,v)<=k的节点v的集合 有m次询问(0<=k<=2): 1 u k d:将集合S(u,k)的 ...
- I/O Planning
同一个BANK的电压必须是一样的,而电气特性则可以不同. 最近GTX调不出来,原来是电平不对 电源的影响 示波器看电源纹波 VCCO是为BANK的IO输出供电.比如LVCMOS33的信号,这个BANK ...
- 20170908工作日记--Volley源码详解
Volley没有jar包,需要从官网上下载源码自己编译出来,或者做成相关moudle引入项目中.我们先从最简单的使用方法入手进行分析: //创建一个网络请求队列 RequestQueue reques ...
- CentOS 7 x64部署tomcat
1.jdk1.7 官网地址:jdk下载地址 下载地址:jdk下载地址 2.tomcat 没啥可说,wget 去下载 3.开放端口 firewall-cmd --zone=/tcp --permane ...
- .NET在IE10下的回传BUG修复
以前我也没注意到,直到有次公司新配了台机器做测试服务器,在测试过程中意外发现凡是涉及PostBack的操作仅在IE10下都无效,其他版本浏览器都没有问题,本机调试也没有问题. 这也就是说在程序相同的情 ...
- ASP.NET Core使用EF Core操作MySql数据库
ASP.NET Core操作MySql数据库, 这样整套环境都可以布署在Linux上 使用微软的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql ...
- C#委托总结-匿名方法&Lambda表达式
1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...
- linux 基本操作笔记
linux文件系统的实现 linux有一个树状结构来组织文件,数的顶端为根目录/,节点为目录,而末节点为所包含的数据文件.我们可以对文件进行多种操作,比如打开和读写. 存储设备分区 文 ...
- flume在windows环境下的使用
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理, ...