下面是java se 7 API 对于java.io.BufferedWriter 继承关系的描述。

BufferedWriter可以将文本写入字符流。它会将字符缓存,目的是提高写入字符的效率。

buffer的大小必须明确,否则将会使用默认的大小。默认的大小对于大多数情况是足够大的。

BufferedWriter提供了一个newLine()的方法,目的是用来换行。毕竟不是所有的平台都使用'\n'的换行方式。

一个Writer对象会将输出立即写入当前的字符流或者字节流。

通常来说,如果这个写入不是非常紧急,建议使用BufferedWriter对象包裹一个费时的Writer对象(比如,FileWriters,OutputStreamWriters)

具体例子如下:

PrintWriter out = new PrintWriter(new BufferWriter(new FileWriter("foo.out")));

上面这个例子,会将PrintWriter对象的输出缓存到文件。如果没有缓存,每次调用print()方法都会讲要输出的字符立即转换为字节,这样的话写入的效率非常不高。

————————————————————————————————————————————————————————————————————

API中已经说明了BufferedWriter可以提高写入字符流的效率。对于耗时的写入操作,使用BufferWriter对象是非常明智的选择。

下面是BufferedWriter的源码。

package java.io;

public class BufferedWriter extends Writer {

    private Writer out;

    private char cb[];
private int nChars, nextChar; private static int defaultCharBufferSize = 8192; private String lineSeparator; public BufferedWriter(Writer out) {
this(out, defaultCharBufferSize);
} public BufferedWriter(Writer out, int sz) {
super(out);
if (sz <= 0)
throw new IllegalArgumentException("Buffer size <= 0");
this.out = out;
cb = new char[sz];
nChars = sz;
nextChar = 0; lineSeparator = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("line.separator"));
} private void ensureOpen() throws IOException {
if (out == null)
throw new IOException("Stream closed");
} void flushBuffer() throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar == 0)
return;
out.write(cb, 0, nextChar);
nextChar = 0;
}
} public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
} private int min(int a, int b) {
if (a < b) return a;
return b;
} public void write(char cbuf[], int off, int len) throws IOException {
synchronized (lock) {
ensureOpen();
if ((off < 0) || (off > cbuf.length) || (len < 0) ||
((off + len) > cbuf.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
} if (len >= nChars) {
/* If the request length exceeds the size of the output buffer,
flush the buffer and then write the data directly. In this
way buffered streams will cascade harmlessly. */
flushBuffer();
out.write(cbuf, off, len);
return;
} int b = off, t = off + len;
while (b < t) {
int d = min(nChars - nextChar, t - b);
System.arraycopy(cbuf, b, cb, nextChar, d);
b += d;
nextChar += d;
if (nextChar >= nChars)
flushBuffer();
}
}
} public void write(String s, int off, int len) throws IOException {
synchronized (lock) {
ensureOpen(); int b = off, t = off + len;
while (b < t) {
int d = min(nChars - nextChar, t - b);
s.getChars(b, b + d, cb, nextChar);
b += d;
nextChar += d;
if (nextChar >= nChars)
flushBuffer();
}
}
} public void newLine() throws IOException {
write(lineSeparator);
} public void flush() throws IOException {
synchronized (lock) {
flushBuffer();
out.flush();
}
} @SuppressWarnings("try")
public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try (Writer w = out) {
flushBuffer();
} finally {
out = null;
cb = null;
}
}
}
}

好像没有新颖之处。。。。。应该是我道行太太太浅,看不出= =

可以看到BufferedWriter之所以叫做buffered,是因为,里面使用了一个char 类型的数组作为缓存(private char cb[];)。

写操作的时候不会立刻写入当前的字符流,而是先写入缓存区。

java.io.BufferedWriter API 以及源码解读的更多相关文章

  1. java.io.writer API 以及 源码解读

    声明 我看的是java7的API文档. 如下图所示,java.io.writer 继承了java.lang.Object,实现的接口有Closeable, Flushable, Appendable, ...

  2. 图解 Java IO : 二、FilenameFilter源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  3. 图解 Java IO : 一、File源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  4. OutputStreamWriter API 以及源码解读

    OutputStreamWriter是字符流与字节流之间的桥梁. 通过它写入的字符流可以通过特殊的字符集转化为字节流.这个特殊的字符集可以指定,也可以采用平台默认的字符集. 每一次调用write()方 ...

  5. Java IO 之 FileInputStream & FileOutputStream源码分析

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  6. java jdk 中HashMap的源码解读

    HashMap是我们在日常写代码时最常用到的一个数据结构,它为我们提供key-value形式的数据存储.同时,它的查询,插入效率都非常高. 在之前的排序算法总结里面里,我大致学习了HashMap的实现 ...

  7. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  8. 【Java集合】ArrayDeque源码解读

    简介 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列. ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的. 它既可以作为队列也可以作为栈. 继承体系 Arr ...

  9. Vue 源码解读(5)—— 全局 API

    目标 深入理解以下全局 API 的实现原理. Vue.use Vue.mixin Vue.component Vue.filter Vue.directive Vue.extend Vue.set V ...

随机推荐

  1. 使用 JSONDoc 记录 Spring Boot RESTful API

    这个博文可以分为两部分:第一部分我将编写一个Spring Boot RESTful API,第二部分将介绍如何使用JSONDoc来记录创建的API.做这两个部分最多需要15分钟,因为使用Spring ...

  2. [php]http响应头解析

    (Status-Line) HTTP/ OK Cache-Control no-cache Content-Length Content-Type image/gif Date Sat, Dec :: ...

  3. 使用vscode实现git同步

    用了git最方便的就是项目同步管理,回到家打开vscode只需要点击一下pull就能全部同步过来.是不是很方便....毕竟之前我都是拿u盘拷贝回家或者存到云盘再下载下来..   我这里之前用的是国内的 ...

  4. spring boot 加载原理

    spring boot quick start 在springBoot里面,很吸引的一个特征就是可以直接把应用打包成jar/war包形式.然后jar/war包可以直接运行的.不需要再配置web Ser ...

  5. Sublime text 3中文汉化教程

    想弄个中文版的sublime,居然可以不用重新下载汉化包或者重新下载简体中文版了~而是只需要安装个插件即可!   工具/原料   电脑 sublime text3编辑器 方法/步骤    启动并进入s ...

  6. virtualenv搭建虚拟环境

    最近因为项目需要,要在CentOS 7 上搭建一套开发环境,虽说Python的背后有着庞大的开源社区支持,但是有一个缺点就是每个包的质量都参差不齐,如果我们在工作服务器上去测试安装每个包,就会造成整个 ...

  7. Python3 断言

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi ''' 断言一般用于后面有非常重要的操作,需要使用前面的数据,而且不容许出 ...

  8. 用C#实现对MSSqlServer数据库的增删改查---DAL层

    说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中:在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和Wa ...

  9. tera term通过ttl脚本 自动连接服务器(转自http://www.cnblogs.com/wxb0328/p/teraterm.html)

    转自http://www.cnblogs.com/wxb0328/p/teraterm.html 在现在的这个公司一直使用tera term来远程连接服务器,感觉很方便,特别是它的ttl脚本配置的自动 ...

  10. anychat安装

    1.下载后,解压到一个目录 2.进入anychat核心服务器目录,并启动   ①.cd %anychat安装路径%/binrver     ②../anychatcoreserver -d   3.进 ...