OutputStreamWriter实例
2016-12-01 21:39
417 查看
一. 输出流
1.1 字节输出流OutputStream
在java中,字节是占1个字节,即8位字节输出流OutputStream - 将指定的字节写入此输出流
1.2 字符流Writer
在java中,字符是占2个Byte,即16位字符输出流Writer - 将字符写入此输出流,字符流的操作比字节流操作好在一点,比如可以直接输出字符串
1.3 OutputStreamWriter
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定编码将写入流中字符编码成字节,在将字节写入输出流OutputStreamWriter 每次调用write()方法都会使用给定字符集对待输出字符编码,编码过程开销是很大的
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
1.4 BufferedWriter
抽象类Writer的实现类(如OutputStreamWriter )调用write()会其输出立即发送到底层字符或字节流,但是每次调用开销很大,建议用 BufferedWriter 包装所有其 write() 操作BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
BufferedWriter 缓冲区为字符数组,默认大小为8192
Writer在clise()之前要调用flush(),将缓冲区中存在数据写入底层输入流
二. OutputStreamWriter输出过程
2.1 内存数据输出
Java内存中数据表现形式一般为字符,当将内存中字符数据输出到本地文件时就会用到OutputStreamWriter:数据从内存中写入硬盘时,顺序是: 缓冲流 -> 转化流 -> 文件流 缓冲流是字符流 文件流是字节流 转化流就是OutputStreamWriter,所以OutputStreamWriter是字符流到字节流的桥梁
2.2 使用缓冲区
OutputStreamWriter实例每次调用write()方法都会在给定字符(或字符集)上调用编码转换器,即将写入字符根据指定的字符集编码成字节,然后写入到底层输出流中由于每次调用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) { } } }
相关文章推荐
- .NET中三层构架开发实例 - 用户注册系统
- jxl导出excel报表实例
- Struts+Spring+Hibernate--SSH整合实例
- 在FLEX Panel的Title上添加控件实例
- ACL配置实例
- linux下bluetooth编程(六)L2CAP层编程实例
- Android应用程序退出实例
- 11GR2单实例安装(ASM)
- Cisco 6509 HSRP 工程实例介绍 一
- 简单的Slony-I设置实例 II
- DB2联合数据库(Federated Database)配置实例
- Python——类属性/实例属性
- 30、实例 jQuery对象与Dom对象的区别以及转换
- JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
- Linux C Socket编程原理及简单实例
- 【Linux开发】linux线程同步方式信号量介绍及实例
- AES 对称加密算法 加密\解密实例
- 如何确保 Shell 脚本只有一个实例运行
- Nginx负载均衡配置实例详解
- 数据库事务隔离级别实例探讨