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, ...
随机推荐
- 一组RS485设备操作命令
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ZNJM ...
- java redis基本操作
package com.redis; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import ...
- 记录一次shell里局部变量的问题
一:起因是这样的,自己今天面试被问到怎么读取某文件夹下所有的文件的每一行的数值的总和:其中文件中数值在每一行里的格式为num|,如33|,因此我第一想到的是通过cut -d\| f1 file来获取每 ...
- CentOS7查看网络的相关命令
转载自:https://www.linuxidc.com/Linux/2015-07/119555.htm 1.切换到超级用户 [Oscar@localhost 桌面]$ su root 2.查询可用 ...
- python文件对比
#-*- encoding:utf-8 -*- class loadDatas(object): def __init__(self): self.path='./data' def load_com ...
- ansible-api 调试
使用api的时候有时候会遇到一些难以想象到的错误,可以通过以下几种方式来定位. 1.使用 自定义 callback class ResultCallback(CallbackBase): def v2 ...
- Apache Struts 2 Documentation Core Developers Guide
http://struts.apache.org/docs/core-developers-guide.html
- (小数化分数)小数化分数2 -- HDU --1717
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 举例: 0.24333333…………=(243-24)/900=73/3000.9545454…… ...
- MFC中不同对话框间使用SendMessage发送自定义消息的具体实现
1. 基本知识 SendMessage的基本结构如下: SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄. UINT Msg, //消息类别(这里可 ...
- Android-创建启动线程的两种方式
方式一:成为Thread的子类,然后在Thread的子类.start 缺点:存在耦合度(因为线程任务run方法里面的业务逻辑 和 线程启动耦合了) 缺点:Cat extends Thread {} 后 ...