先看两个实例
代码一:
try {
FileWriter writer = new FileWriter(fileName);
BufferedWriter bw = new BufferedWriter(writer);
//吐出指定数个纪录
for (int i = 0; i < 10; i++) {
bw.write("str1")
}
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
代码二
try {
FileWriter writer = new FileWriter(fileName);
BufferedWriter bw = new BufferedWriter(writer);
string str = "";
for (int i = 0; i < 10; i++) {
str += "str1";
}
bw.write(str)
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
表面上看代码二效率要高些,毕竟只有一次“write”动作
其实研究下BufferedWriter 源码,其实这两种方式效率是差不多的。
我们可以跳进代码探究其一步步实现(JDK1.7)。
构造
//这里已经制定了缓存区大小defaultCharBufferSize
//private static int defaultCharBufferSize = 8192;
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"));
}
写文件操作(源码如下)
//Writer.java
public void write(String str) throws IOException {
write(str, 0, str.length());
}
write调用如下代码
由此可见达到缓冲区大小,才会调用写流操作
BufferedWriter.java
private char cb[];,
所以 cb 是全局的,
//BufferedWriter.java
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);
//cb 是全局的,
s.getChars(b, b + d, cb, nextChar);
b += d;
nextChar += d;
//达到8192 才刷新磁盘
//nextChar cb下一个写位置
//nextChar 至多是"=" 不会大于的,读者可以自己思虑下
if (nextChar >= nChars)
flushBuffer();
}
}
}
flushBuffer 操作
void flushBuffer() throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar == 0)
return;
out.write(cb, 0, nextChar);
//全局量nextChar 归零
nextChar = 0;
}
}
通过分析可知,代码一和代码二写文件效率是一样的