目录
StreamEncoder流与OutputStreamWriter构造函数的联系
再次理解StreamEncoder、OutputStreamWriter、FileWriter
注意:本文参考 https://blog.csdn.net/ai_bao_zi/article/details/81181198
实例域
//默认的字节缓冲区大小,8192个字节
private static final int DEFAULT_BYTE_BUFFER_SIZE =8192;
//确保流打开以便可以进行输出和输入
private volatile boolean isOpen = true;
//每次输出前都确保流是打开的状态
private void ensureOpen() throws IOException
{
if (!isOpen)
throw new IOException("Stream closed");
}
private boolean isOpen()
{
return isOpen;
}
//字符集即我们设置的"utf-8"这种
private Charset cs;
//字符编码器
private CharsetEncoder encoder;
//字节缓冲区
private ByteBuffer bb;
//底层输出流
private final OutputStream out;
//写入信道
private WritableByteChannel ch;
//为了保证读入的字符不乱码 则每次读入不能少于两个字符
private boolean haveLeftoverChar = false;
//左侧字符
private char leftoverChar;
//字符缓冲区对象--专用于左侧字符操作
private CharBuffer lcb = null;
构造方法
//构造方法初始化实例域
private StreamEncoder(OutputStream out, Object lock, Charset cs)
{
this(out, lock, cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE));
}
//构造方法初始化实例域--注意此处有点疑问,不管ch是否为null都会设置字节缓冲区的大小,感觉是否最后if有点多余
@SuppressWarnings("unused")
private StreamEncoder(OutputStream out, Object lock, CharsetEncoder enc)
{
super(lock);
this.out = out;
this.ch = null;
this.cs = enc.charset();
this.encoder = enc;
//这个if的条件不可能为真,永远不进入该条件中
if (false && out instanceof FileOutputStream)
{
ch = ((FileOutputStream) out).getChannel(); //得到输出流的信道
if (ch != null)
bb = ByteBuffer.allocateDirect(DEFAULT_BYTE_BUFFER_SIZE); //设置字节缓冲区大小为默认的大小
}
if (ch == null)
{
bb = ByteBuffer.allocate(DEFAULT_BYTE_BUFFER_SIZE);
}
}
StreamEncoder流与OutputStreamWriter构造函数的联系
OutputStreamWriter的构造方法都是调用了StreamEncoder的forOutputStreamWriter方法,那么我们细看下forOutputStreamWriter方法
forOutputStreamWriter本质:利用底层的FileOutputStream流和字符集名称来调用StreamEncoder的构造方法创建StreamEncoder对象,因此可以看出OutputStreamWriter的构造方法就是创建StreamEncoder的对象然后赋予给其中的final常量引用
//初始化对象StreamEncoder
public static StreamEncoder forOutputStreamWriter(OutputStream out,