java.io.BufferedWriter API 以及源碼解讀
下面是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 以及源碼解讀