转载请注明源出处: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. A标签中传递的中文参数到Servlet 后台request.getParameter()接收时出现中文乱码

    package util; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequ ...

  2. changetoutf-8

    import chardet import os # ANSI文件转UTF-8 import codecs import os def strJudgeCode(str): return charde ...

  3. new Date()之参数传递

    JavaScript下,new Date([params]),参数传递有以下五种方式: 1.new Date("month dd,yyyy hh:mm:ss"); 2.new Da ...

  4. H3C交换机流量镜像

    今天需要对交换机进行本地流量镜像,在此记录: 交换机:H3C S5120 配置本地端口镜像时,用户首先要创建一个本地镜像组,然后为本地镜像组配置源端口和目的端口. 表1-1 配置本地端口镜像 操作 命 ...

  5. What is Pay Me to Learn——Google Summer of Code 2013

    原文链接:http://zhchbin.github.io/2013/10/17/what-is-pay-me-to-learn/ 背景 今天早上才想起来,自己还欠着一件事情没有做完.很久在人人上之前 ...

  6. delphi 安卓程序如何读取外部配置文件

    1)编辑一个config.txt文件,填写配置系统. 2)有外部加载文件时,安卓发布需要另行指定文件发布目录位置 比如加载config.txt需要在 首先利用Project->Deploymen ...

  7. Elasticsearch 在 windows 和 ubuntu 下详细安装过程

    1. 前言 作为一名 .NET 平台开发者,选择开发框架时总会面临更多的局限性,不过对于搜索这种刚需服务来说,开源框架可供选择的余地还是比较大的.笔者之前用的是 Lucene.net ,现在深感其使用 ...

  8. Django开发Web监控工具-pyDash

      今天发现了一个比较有意思的监控工具,是基于Django开发的,开发大牛已经开放了源代码,向大牛致敬,同时研究研究,目前感觉这个监控比较直观,可以针对个人服务器使用,同时涉及的环境比较简单,部署起来 ...

  9. 使用MTR命令诊断网络问题

      以前在检查网络时习惯使用ping命令,因为ping命令非常简单,现在喜欢上了mtr命令,因为它真的很强大,但是对于刚刚接触这个命令的同学来说,理解起来就没有ping命令来的那么直观了,所以今天写一 ...

  10. KMeans|| in Spark MLLib

    算法跟传统的kmeans的区别主要在于:kmeans||的k个中心的不是随机初始化的.而是选择了k个彼此"足够"分离的中心. org.apache.spark.mllib.clus ...