在写这篇笔记时我在想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这个桥梁去完成的
不知我的解释是否能全面解答你的疑问,如有笔误请指教!
分享到:
相关推荐
在Java的基础学习中,理解并掌握输入输出流(IO Stream)的使用是至关重要的。本教程聚焦于Java中的`BufferedWriter`类,它是IO流处理中的一个重要组件,同时也涉及到了设计模式中的装饰模式。 `BufferedWriter`是...
标题中的"BufferedWriter.rar"表明这是一个与Java编程语言...压缩包内的"BufferedWriter.java"可能是包含BufferedWriter示例代码的文件,通过分析和学习这个文件,可以更深入地理解BufferedWriter的工作原理和用法。
Java提供了丰富的类库用于文件的读写,如File类、BufferedReader和BufferedWriter等,以及更高级的流式操作。理解输入输出流的工作原理,学会使用FileInputStream和FileOutputStream进行文件操作,以及掌握NIO(非...
5. **输入输出流**:Java的I/O流系统支持文件读写、网络通信等多种数据传输,是处理数据交互的关键技术,包括FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类的使用。 6. **线程与并发**:...
7. **输入输出流**:熟悉FileInputStream、FileOutputStream、BufferedReader和BufferedWriter等IO类,用于读写文件,以及System.in、System.out和Scanner类用于标准输入输出。 8. **字符串处理**:了解String类的...
例如,`FileInputStream`和`FileOutputStream`用于文件读写,`InputStreamReader`和`OutputStreamWriter`用于字符编码转换,`BufferedReader`和`BufferedWriter`则提高了读写性能。 4. **异常处理**:`java.lang....
6. **输入输出(I/O)**:包括System.in, System.out.println, 文件读写,流的概念,以及FileInputStream, FileOutputStream, BufferedReader, BufferedWriter等类的使用。 7. **多线程**:Java内置的Thread类,...
实例可能包含FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类的使用。 9. **多线程**:Java内置了多线程支持,可以实现并发执行。通过例子,你可以学习如何创建和管理线程,理解同步和互斥...
本资源包“Java_se_io学习 Java学习资料源码”包含了深入学习Java I/O系统的相关资料和源码,对于Java开发者来说,这是一个非常宝贵的参考资料。 I/O流是Java中用于读写数据的对象,它们分为字节流和字符流两大类。...
这部分内容会解释流的概念,以及如何使用BufferedReader、BufferedWriter等类进行高效的数据传输。 6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口,以及同步控制方法如synchronized...
学习者可以学习到如何使用Java的File、BufferedReader和BufferedWriter类来实现这一功能。 5. **集合框架**:在管理农场中的各种资源(如农作物、动物)时,会用到Java的集合框架,如ArrayList、LinkedList、...
例子可能包含使用FileInputStream和FileOutputStream进行基本读写,或者使用BufferedReader和BufferedWriter进行文本处理。 此外,Java标准库中的其他重要包,如java.util.concurrent对于并发编程,java.nio对于...
6. **输入/输出(I/O)**:掌握流的概念,了解FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类的使用,以及如何进行文件读写操作。 7. **多线程**:理解线程的概念,学习如何创建和管理线程...
Java提供了丰富的类库进行文件读写,如File、InputStream、OutputStream、BufferedReader和BufferedWriter等。理解如何使用这些类进行文件操作对于处理数据存储至关重要。 异常处理是Java编程中的关键部分,它通过...
FileInputStream和FileOutputStream用于读写文件,而BufferedReader和BufferedWriter则提供缓冲,提高读写性能。此外,还有ObjectInputStream和ObjectOutputStream用于序列化和反序列化对象。 【网络编程】 Java...
理解缓冲区的概念和使用BufferedReader、BufferedWriter等类提高效率。 8. **异常处理**:理解异常处理机制,包括try-catch-finally语句块,以及如何自定义异常。 9. **多线程**:学习如何创建和管理线程,包括...
根据提供的文件信息,“io学习笔记”这一文档涵盖了IO学习的所有要点与笔记,下面将对这些内容进行详细解析,以便更好地理解和掌握IO相关的知识点。 ### IO基础概念 在计算机科学领域中,**IO**(Input/Output)指的...
7. **Java I/O与NIO**:理解传统I/O和NIO的区别,了解File、InputStream、OutputStream、Reader、Writer等类的用法,以及BufferedReader、BufferedWriter等缓冲流。 8. **反射与注解**:了解反射机制如何在运行时...
掌握FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等基本流的使用,以及流的分类(字符流与字节流)、转换流和对象流的操作,可以让你更好地进行文件操作和网络通信。 五、多线程 Java提供了...