在写这篇笔记时我在想BufferedWriter用缓冲,每次刷新缓存(flush()方法)就行,我于是就有个疑问:比如:缓存大小为1024,当我已通过write(char[] cbuf, int off, int len)
方法在缓存中保存1000个字符,那么当再次调用write方法写入25个时,最后的字符会不会丢呢?经代码验证并没有丢失,那是什么原因?带着疑问你看下面我的日记你就会明白为什么?
1. 首先认识一下
Writer ,它是抽象类,其中有一个抽象方法write(char[] cbuf, int off, int len)
和一个具体实现了的
write(
String str, int off, int len)
,其实
write(
String str)
里面也是调用了
write(char[] cbuf, int off, int len)
;而这个方法是抽象的,所以取决于继承Writer抽象类的具体实现类对抽象方法的实现。
2.
BufferedWriter
是抽象类Writer的实现类,并实现了抽象方法
write(char[] cbuf, int off, int len)
;
这个实现中添加了如果添加的字符数组的大小超过了默认缓存的大小(8096或你设置的大小),则采取先刷新缓存flushBuffer的方法,flushBuffer中先将缓存中的字符写出,在清空缓存,之后循环写入伪代码如下:
nChars:缓存数组大小
nextChar:缓存数组现在指针,即已用
//…..
Int b=off,t=off+length,
While(b<t) {
1、Int min = 此时缓存剩余的大小(nChars-nextChar)和t-b的最小值
2、将min个字符复制到缓存中
3、b+=min;nextChar+=min( 缓存指针也下移min位);
4、if (nextChar>=nChars){
flushBuffer();
}
}
缓存方法伪码如下:
flushBuffer(){
//……
out.write(cb,0,nextChar);
nextChar =0;
}
BufferedWriter中的write(
String str, int off, int len)
底层也是调用BufferedWriter中的
write(char[] cbuf, int off, int len)
,都不会出现缓存溢出导致的数据丢失问题,大可放心使用
3. BufferedWriterd的构造方法中还要有Writer的具体实现类,一般如:OutputSteamWriter或FileWriter等字符流,
BufferedWriter中的write方法的实具体现实际是BufferedWriter在创建实例时所传递参数对象(字符流,如上面FileWriter)的write的方法,以下是常用的应用举例。
共举2个例子如下:
1) BuffferedWriter bw = new BufferedWritter(new OutputStreamWriter(FileOutputStream(fileName),”utf-8”));
OutputStreamWriter中的write方法大致如下:
se.write(char[] cbuf, int off, int len)
其中se是StreamEncoder的实例,其实不止OutputStreamWriter的Write方法,大部分的方法都是调用StreamEncoder的同名称的方法,其实StreamEncoder也是继承了Writer的实现类,它在OutputStreamWriter中就是个代理。
(主要是字符和字节之间的过渡,起到桥梁的作用。)强调一下
FileOutputStream中的读写方法都是native方法,直接通过JNI操作系统资源
2) BuffferedWriter bw = new BufferedWritter(FileWriter(fileName));
其中FileWriter是OutputStreamWriter
的子类,FileWriter的构造方法伪码如下:
public FileWriter(file)throws IOException{
super(new FileOutputStream(file))
}
从上面的代码可以看出其实都是通过OutputStreamWriter这个桥梁去完成的
不知我的解释是否能全面解答你的疑问,如有笔误请指教!
分享到:
相关推荐
SWING-III.pptJava学习资料 运用File类进行文件操作 理解流,标准输入/输出流的概念 运用FileInputStream和FileOutputStream类读写文本文件 运用BufferedReader和BufferedWriter类读写文本文件 运用DataInputStream...
主要给大家介绍了关于Java文件、文件夹权限修改的两种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
学习目标;目录和文件管理;创建文件对象;创建文件对象;创建文件;创建文件夹;删除文件(夹);文件重命名;9;10;输入输出流(I/O Stream);输入流(Input Stream);输出流(Output Stream);文本文件 vs 二进制文件;文本文件 vs ...
请以你所学习的FileOutputStream、BufferedOutputStream、FileWriter和BufferedWriter,编写程序实现向文件写入10000次26个英文字母代替疫情信息,比较四者在向文件写入时的性能差别。(注:可以使用System....
Java学习日志(二十一)缓冲流原理字节缓冲输出流:BufferedOutputStream字节缓冲输入流:BufferedInputStream字符缓冲输出流:BufferedWriter字符缓冲输入流:BufferedReader文件复制文件排序转换流原理字符转换...
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...
目录java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流字节缓冲流 —BufferedInputStream&BufferedOutputStream字符缓冲流—BufferedReader&BufferedWriter转换流—InputStreamReader&...
真正做到零基础入门学习,适合初学者的教程! 课程内容包括: 1.File类 2.IO流简介 3.流的分类 输入流、输出流 字节流、字符流 节点流、包装流 4.字节流 InputStream:FileInputStream、...
Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z-xing 码),该文章主要用于笔者自己学习中的总结,暂贴出代码部分,待以后有时间再补充算法的详细细节。 Activity class Java 文件 package ...
学会使用File,FileReader,BufferedReader,FileWriter,BufferedWriter,PrintWriter等类输入输出对象。 掌握串行化概念,学会使用FileInputStream,FileOutputStream,ObjectInputStream,...
2.6 学习成绩查询 2.7 求最大公约数与最小公倍数 2.8 完全平方数 2.9 统计字母、空格、数字和其它字符个数 2.10 求主对角线之和 2.11 完数求解 2.12 求s=a+aa+aaa+aaaa+aa...a的值 2.13 高度计算 2.14 乘法口诀 2.15...
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; ...
写一个函数,例如:给你的 a b c 则输出 abc acb bac bca cab cba import java.util.ArrayList; import java.util.List; public class NumTest { public static void main(String[] args) { ...