当前位置: 首页 > news >正文

IO流之转换流

转换流

OutputStreamWriter类

查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去

public static void writeCN() throws Exception {
		//创建与文件关联的字节输出流对象
		FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");
		//创建可以把字符转成字节的转换流对象,并指定编码
		OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
		//调用转换流,把文字写出去,其实是写到转换流的缓冲区中
		osw.write("你好");//写入缓冲区。
		osw.close();
	}

OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

 InputStreamReader类

查阅InputStreamReader的API介绍,InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		//演示字节转字符流的转换流
		readCN();
	}
	public static void readCN() throws IOException{
		//创建读取文件的字节流对象
		InputStream in = new FileInputStream("c:\\cn8.txt");
		//创建转换流对象 
		//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
        InputStreamReader isr = new InputStreamReader(in,"utf-8");
		//使用转换流去读字节流中的字节
		int ch = 0;
		while((ch = isr.read())!=-1){
			System.out.println((char)ch);
		}
		//关闭流
		isr.close();
	}
}

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

转换流和子类区别

发现有如下继承关系:

OutputStreamWriter:

                  |--FileWriter:

InputStreamReader:

|--FileReader;

 

父类和子类的功能有什么区别呢?

OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流什么时候用子类呢?

条件:

1、操作的是文件。2、使用默认编码

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

  

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/lxx2014/p/9541148.html

相关文章:

  • Enerprise Solution Main 启动方法源代码
  • position的static、relative、absolute、fixed、inherit
  • 内部和外部排序排序
  • python遍历
  • C#基础总结 .
  • LeetCode 15. 3Sum; 16. 3Sum Closest; 259. 3Sum Smaller; 18. 4Sum
  • 蓝牙4.0 For IOS
  • gpio_direction_output和gpio_set_value
  • JVM系列三:JVM运行时数据区
  • web安全Wargame—Natas解题思路(1-26)
  • jQuery插件开发详细教程
  • Vue.js从Virtual DOM映射到真实DOM的过程
  • screen终端命令使用
  • 德国精品软件   cFosSpeed 网络优化软件
  • 数据分析师完整的知识结构
  • JS 中的深拷贝与浅拷贝
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • angular2开源库收集
  • HashMap ConcurrentHashMap
  • HomeBrew常规使用教程
  • JavaScript DOM 10 - 滚动
  • java小心机(3)| 浅析finalize()
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • ng6--错误信息小结(持续更新)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Octave 入门
  • React+TypeScript入门
  • Spring声明式事务管理之一:五大属性分析
  • tweak 支持第三方库
  • Vue.js 移动端适配之 vw 解决方案
  • vue2.0项目引入element-ui
  • 对JS继承的一点思考
  • 基于webpack 的 vue 多页架构
  • 计算机在识别图像时“看到”了什么?
  • 今年的LC3大会没了?
  • 前端路由实现-history
  • 在Unity中实现一个简单的消息管理器
  • 7行Python代码的人脸识别
  • Hibernate主键生成策略及选择
  • ​Python 3 新特性:类型注解
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • $NOIp2018$劝退记
  • (4.10~4.16)
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (论文阅读40-45)图像描述1
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (实战篇)如何缓存数据
  • (数据结构)顺序表的定义
  • (四) Graphivz 颜色选择
  • (万字长文)Spring的核心知识尽揽其中
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)