转载请注明源出处: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的更多相关文章

  1. Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别

    IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...

  2. Java IO--字符流--BufferedReader和BufferedWriter

    从昨天开始没事情干时,决定梳理梳理Java IO流,因为觉得太混乱这个东西,妈的,咋就这么多类型,想累死谁啊,这里并不是埋怨创造者,而是气自己看着看着老跑偏,实在看不进去,太多了,想睡觉,所以现在决定 ...

  3. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  4. Java之IO(零)总结

    转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...

  5. java中OutputStream字节流与字符流InputStreamReader 每一种基本IO流BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWriter,FileInputStream,FileReader,FileWriter,InputStr

    BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWri ...

  6. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...

  7. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

  8. Java IO(十八) BufferedReader 和 BufferedWriter

    Java IO(十八) BufferedReader 和 BufferedWriter 一.介绍 BufferedReader 和 BufferedWriter 是字符缓冲流,分别继承自 Reader ...

  9. 通过源码学Java基础:BufferedReader和BufferedWriter

    准备写一系列Java基础文章,先拿Java.io下手,今天聊一聊BufferedReader和BufferedWriter BufferedReader BufferedReader继承Writer, ...

随机推荐

  1. 7) mvn dependency:tree

    http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html mvn dependency:tree 查看 <de ...

  2. golang的json操作[转]

    package main   import (     "encoding/json"     "fmt"     "os" )   typ ...

  3. 2013多校联合3 G The Unsolvable Problem(hdu 4627)

    2013-07-30 20:35 388人阅读 评论(0) 收藏 举报 http://acm.hdu.edu.cn/showproblem.php?pid=4627 The Unsolvable Pr ...

  4. bootstrap 问题

    less; sass: css预处理:可以直接使用.css,也可以修改.less,生成定制化的css CDN: 服务,使用这个效果会更好.theme一般不引入,jquery一般在js之前引入. 使用b ...

  5. ReportMachine OCX

    http://rmachine.haotui.com/thread-55-1-1.html 偏高偏低提示 [IF( [RMDBDataSet1."abnormalIndicator" ...

  6. matlab的特殊字符(上下标和希腊字母等)

    'T=25\circC',(摄氏度) 下标用 _(下划线) 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...

  7. Sql Server 2008 压缩数据库日志文件

    第一步:将数据库设置为简单模式 选中数据库点右键->属性: 第二步:收缩数日志文件 1, 2,   第三步:将恢复模式改回为完整模式     如果你觉得用UI界面麻烦,那你就用SQL语句吧   ...

  8. Microsoft Sql Server 2016安装在CentOS7下

    安装过程 如何安装直接参考这个文章:安装sql server 整个安装过程非常简单. 上面的文档里是通过 sudo 命令,用root身份来执行,不过这里为了简单,就用root账号来安装的. (1)下载 ...

  9. [翻译]第一天 - 在 Windows 下安装和运行 .NET Core

    原文: http://michaelcrump.net/getting-started-with-aspnetcore/ 免责声明:我不是 .NET Core 开发团队的一员,并且使用的是公开.可用的 ...

  10. STM32的时钟配置随笔

    以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...