本帖最后由 观决 于 2014-5-19 19:31 编辑
刚才上课回来 我就按照源码里面的最开始的方法一个一个的推 终于找到那个8192了 坑爹啊....
Writer.java中的write()
public void write(char cbuf[]) throws IOException {
write(cbuf, 0, cbuf.length);
}
这里去找write(cbuf, 0, cbuf.length);
public void write(String str, int off, int len) throws IOException {
synchronized (lock) {
char cbuf[];
if (len <= writeBufferSize) {
if (writeBuffer == null) {
writeBuffer = new char[writeBufferSize];
}
cbuf = writeBuffer;
} else { // Don't permanently allocate very large buffers.
cbuf = new char[len];
}
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
}
这里就要找到write(cbuf, 0, len);这里发现是一个抽象类
abstract public void write(char cbuf[], int off, int len) throws IOException;
这里就找到了子类OutputStreamWriter 里面的方法
public void write(char cbuf[], int off, int len) throws IOException {
se.write(cbuf, off, len);
}
这里的se 是一个private final StreamEncoder se;这个类
然后我看了上面的导入
import sun.nio.cs.StreamEncoder;
这个包里面 我就在src下面找 (根本就没有 我就凌乱了)
然后 我就百度了这个StreamEncoder
幸好百度有链接在这里
http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html
下面是实现的代码
private static final int DEFAULT_BYTE_BUFFER_SIZE = 8192; 默认的大小
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;
}
implWrite(cbuf, off, len); 下面又是这个方法
}
}
void implWrite(char cbuf[], int off, int len) 263 throws IOException
264 {
265 CharBuffer cb = CharBuffer.wrap(cbuf, off, len);
266
267 if (haveLeftoverChar)
268 flushLeftoverChar(cb, false);
269
270 while (cb.hasRemaining()) {
271 CoderResult cr = encoder.encode(cb, bb, false);
272 if (cr.isUnderflow()) {
273 assert (cb.remaining() <= 1) : cb.remaining();
274 if (cb.remaining() == 1) {
275 haveLeftoverChar = true;
276 leftoverChar = cb.get();
277 }
278 break;
279 }
280 if (cr.isOverflow()) {
281 assert bb.position() > 0;
282 writeBytes();
283 continue;
284 }
285 cr.throwException();
286 }
287 }
然后又是一些方法的调用 void implWrite(char cbuf[], int off, int len)
这里后面就一直调用吧 <这里代码基本开始看不懂了> 不过起码找到了这个8192的默认值 |