Java OutputStreamWriter类

OutputStreamWriter是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流的输出对象。它是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

构造函数

OutputStreamWriter(OutputStream out, String charsetName)    创建使用指定字符集的 OutputStreamWriter。  
OutputStreamWriter(OutputStream out, Charset cs)     创建使用给定字符集的 OutputStreamWriter。   
OutputStreamWriter(OutputStream out)     创建使用默认字符编码的 OutputStreamWriter。  
OutputStreamWriter(OutputStream out, CharsetEncoder enc)    创建使用给定字符集编码器的 OutputStreamWriter。  

关键字

private final StreamEncoder se;     核心类、用于将字符编码成字节  

方法

String getEncoding()     返回此流使用的字符编码的名称。      
void write(int c)   写入单个字符。  
void write(char cbuf[], int off, int len)    写入字符数组的某一部分。  
void write(String str, int off, int len)      写入字符串的某一部分。  
void flush()    刷新该流的缓冲。   
void close()    关闭此流,但要先刷新它。

源码分析

/** 
 * 字符输出流、是使用指定的编码或者时系统默认的编码将字节转换成字符。 
 * 是OutputStream转换成Writer的桥梁、也是PrintStream、能够在构造的时候指定编码的关键。 
 * 实际上是将OutputStream传递给了StreamEncoder来操作out 
 */  
public class OutputStreamWriter extends Writer {  
  
    //通过StreamEncoder se进行字节与字符的转码。  
    private final StreamEncoder se;  
  
    /** 
     * 用指定的编码将OutputStream out转换成OutputStreamWriter。 
     */  
    public OutputStreamWriter(OutputStream out, String charsetName)  
    throws UnsupportedEncodingException  
    {  
        // 调用父类Writer的构造方法创建一个新的字符流 writer,其关键部分将同步给自身。  
        super(out);  
        if (charsetName == null)  
            throw new NullPointerException("charsetName");  
        //初始化StreamEncoder se.  
        se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);  
    }  
  
    /** 
     * 使用默认编码创建osw。 
     */  
    public OutputStreamWriter(OutputStream out) {  
    super(out);  
    try {  
        se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);  
    } catch (UnsupportedEncodingException e) {  
        throw new Error(e);  
        }  
    }  
  
    /** 
     * 使用指定的字符集创建osw 
     */  
    public OutputStreamWriter(OutputStream out, Charset cs) {  
    super(out);  
    if (cs == null)  
        throw new NullPointerException("charset");  
    se = StreamEncoder.forOutputStreamWriter(out, this, cs);  
    }  
  
    /** 
     * 使用指定的字符编码创建osw 
     */  
    public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {  
    super(out);  
    if (enc == null)  
        throw new NullPointerException("charset encoder");  
    se = StreamEncoder.forOutputStreamWriter(out, this, enc);  
    }  
  
    /** 
     * 获取字符流使用的字符集、或者编码 
     */  
    public String getEncoding() {  
        return se.getEncoding();  
    }  
  
    /** 
     * 将osw中的字符flush到底层OutputStream中、此方法不包含flush底层out中的字节 
     */  
    void flushBuffer() throws IOException {  
        se.flushBuffer();  
    }  
  
    /** 
     * 将字节转换成字符后、向out中写入一个字符(字符的编码在构造OutputStreamWriter时指定或者使用默认编码 
     */  
    public void write(int c) throws IOException {  
        se.write(c);  
    }  
  
    /** 
     * 将cbuf中的一部分写入到out中 
     */  
    public void write(char cbuf[], int off, int len) throws IOException {  
        se.write(cbuf, off, len);  
    }  
  
    /** 
     * 将str一部分写入到out中 
     */  
    public void write(String str, int off, int len) throws IOException {  
        se.write(str, off, len);  
    }  
  
    /** 
     * flush此流、实际上是调用StreamEncoder的flush方法、 
     */  
    public void flush() throws IOException {  
        se.flush();  
    }  
  
    /** 
     * 关闭StreamEncoder、即关闭OutputSteramWriter. 
     */  
    public void close() throws IOException {  
        se.close();  
    }  
}

例子

将字节的文件输出流,以字符的形式输出。

public class OutputStreamWriterDemo01{  
    public static void main(String args[]) throws Exception {   // 所有异常抛出  
        File f = new File("d:" + File.separator + "test.txt") ;   
        Writer out = null ; // 字符输出流  
        out = new OutputStreamWriter(new FileOutputStream(f)) ; // 字节流变为字符流  
        out.write("hello world!!") ;    // 使用字符流输出  
        out.close() ;  
    }  
};  
/**
* OutputStreamWriter 演示函数
*
*/
private static void testWrite() {
    try {
        // 创建文件“file.txt”对应File对象
        File file = new File(FileName);
        // 创建FileOutputStream对应OutputStreamWriter:将字节流转换为字符流,即写入out1的数据会自动由字节转换为字符。
        OutputStreamWriter out1 = new OutputStreamWriter(new FileOutputStream(file), CharsetName);
        // 写入10个汉字
        out1.write("字节流转为字符流示例");
        // 向“文件中”写入"0123456789"+换行符
        out1.write("0123456789\n");

        out1.close();

    } catch(IOException e) {
        e.printStackTrace();
    }
}

总结

OutputStreamWriter、InputStreamReader分别为InputStream、OutputStream的低级输入输出流提供将字节转换成字符的桥梁、他们只是外边的一个门面、真正的核心是OutputStreamWriter中的StreamEncoder:
1、使用指定的或者默认的编码集将字符转码为字节。
2、调用StreamEncoder自身实现的写入方法将转码后的字节写入到底层字节输出流中。  


版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。