OutputStreamWriter实例

一. 输出流

1.1 字节输出流OutputStream

  1. 在java中,字节是占1个字节,即8位
  2. 字节输出流OutputStream - 将指定的字节写入此输出流

1.2 字符流Writer

  1. 在java中,字符是占2个Byte,即16位
  2. 字符输出流Writer - 将字符写入此输出流,字符流的操作比字节流操作好在一点,比如可以直接输出字符串

1.3 OutputStreamWriter

OutputStreamWriter 是字符流通向字节流的桥梁:使用指定编码将写入流中字符编码成字节,在将字节写入输出流

  1. OutputStreamWriter 每次调用write()方法都会使用给定字符集对待输出字符编码,编码过程开销是很大的
  2. 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器

1.4 BufferedWriter

抽象类Writer的实现类(如OutputStreamWriter )调用write()会其输出立即发送到底层字符或字节流,但是每次调用开销很大,建议用 BufferedWriter 包装所有其 write() 操作

  1. BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
  2. BufferedWriter 缓冲区为字符数组,默认大小为8192
  3. Writer在clise()之前要调用flush(),将缓冲区中存在数据写入底层输入流

二. OutputStreamWriter输出过程

2.1 内存数据输出

Java内存中数据表现形式一般为字符,当将内存中字符数据输出到本地文件时就会用到OutputStreamWriter:

数据从内存中写入硬盘时,顺序是:
缓冲流 -> 转化流 -> 文件流
缓冲流是字符流
文件流是字节流
转化流就是OutputStreamWriter,所以OutputStreamWriter是字符流到字节流的桥梁

2.2 使用缓冲区

  1. OutputStreamWriter实例每次调用write()方法都会在给定字符(或字符集)上调用编码转换器,即将写入字符根据指定的字符集编码成字节,然后写入到底层输出流中
  2. 由于每次调用write()都会调用转换器,为了提高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

比如bufferWriter.write(“待输出”),bufferWriter会将字符串【待输出】缓存到缓冲区中,缓冲区是一个字符char数组,默认大小是8192

2.3 字符转字节输出

当缓冲区满了,将缓冲区传给底层输出流:nio处理
rt.jar sun.nio.cs.StreamEncoder

StreamEncoder.write(char cbuf[], int off, int len)

1.java.nio.CharBuffer - 字符缓冲区
2.java.nio.charset.CharsetEncoderencode(CharBuffer in, ByteBuffer out, boolean endOfInput) -  将输入字符缓冲区in中字符编码,得到的字节写入输出缓冲区out, 返回编码结果CoderResult
3.java.nio.charset.CoderResult - 编码结果状态的表述
4.sun.nio.cs.StreamEncoder.writeBytes() - 将字节输出缓冲区ByteBuffer中字节写入底层输出流

2.4 close()之前记得flush()

刷新该流的缓冲,防止缓冲区中还存在部分数据没有写入底层输出流

三. OutputStreamWriter输出实例

    @Test
    public void TestOutputStream() throws Exception {
        File file = new File("C:\\Users\\Administrator\\Desktop\\config.conf");
        OutputStream fileOutputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
            bufferedWriter = new BufferedWriter(outputStreamWriter);
            bufferedWriter.write("Hello World");
            bufferedWriter.newLine();
            bufferedWriter.write("Hello Java");
            // close前调用flush()
            bufferedWriter.flush();
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();                 
                }
            } catch (Exception e) {
            }
            try {
                if (outputStreamWriter != null) {
                    outputStreamWriter.close();
                }
            } catch (Exception e) {
            }
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (Exception e) {
            }

        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值