Java IO--字符流--InputStreamReader 和 OutputStreamWriter
今天继续学习字符流的子类!!!!
先来熟悉一下适配器设计模式:(手写的,,嘿嘿)
因为据说InputStreamReader 和OutputStreamWriter采用了适配器模式(现在我还没能理解,先记住)
1 InputStreamReader
是字节流转换成字符流的桥梁,使用指定的Chartset将将从底层读取的字节转换成字符返回到程序中,使用的字符集可以由名称指定或显示给定,或是默认字符集。本质使用其内部的一个类来完成所有工作:StreamDecoder、使用编码将字节转换成字符、InputStreamReader对StreamDecoder进行了封装、isr内部所有方法核心都是调用StreamDecoder来完成的。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
1.1类图
1.2 构造函数
- InputStreamReader(InputStream in) 创建一个使用默认字符集的isr。
- InputStreamReader(InputStream in, Chartset cs) 创建使用给定字符集的isr。
- InputStreamReader(InputStream in, ChartsetDecoder dec) 创建使用给定字符集解码器的isr。
- InputStreamReader(InputStream in, String chartsetName) 创建使用指定字符集的isr。
1.3 代码示例
public static void InputStreamReaderTest() throws IOException{
InputStream in = new FileInputStream("D:1.txt");
InputStreamReader isDefault = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isDefault);
System.out.println("isDefault encoding :" + isDefault.getEncoding() + "----content:" + br.readLine());
if(in != null){
in.close();
}
if(isDefault != null){
isDefault.close();
}
if(br != null){
br.close();
}
}
运行结果:
把InputStreamReader isDefault = new InputStreamReader(in);
改成:InputStreamReader isDefault = new InputStreamReader(in, ‘’UTF-8‘’);
运行结果:
2 OutputStreamWriter
是字符流通向字节流的桥梁,每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
2.2 构造函数
- OutputStreamWriter(OutputStream out) 创建使用默认字符编码的osw。
- OutputStreamWriter(OutputStream out, Chartset cs) 创建使用给定字符集的osw。
- OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的osw。
- OutputStreamWriter(OutputStream out) 创建使用指定字符集的osw。
2.3 代码示例
public static void outputStreamWriterTest() throws IOException{
OutputStream out = new FileOutputStream("D:1.txt", true);
OutputStreamWriter osw1 = new OutputStreamWriter(out);//默认编码
BufferedWriter bfw1 = new BufferedWriter(osw1);
bfw1.newLine();
bfw1.write("我");
OutputStreamWriter osw2 = new OutputStreamWriter(out, "GBK");//GBK编码
BufferedWriter bfw2 = new BufferedWriter(osw1);
bfw2.newLine();
bfw2.write("我");
OutputStreamWriter osw3 = new OutputStreamWriter(out, "UTF-8");//UTF-8编码
BufferedWriter bfw3 = new BufferedWriter(osw1);
bfw3.newLine();
bfw3.write("我");
bfw1.flush();
bfw2.flush();
bfw3.flush();
bfw1.close();
bfw2.close();
bfw3.close();
osw1.close();
osw2.close();
osw3.close();
out.close();
}
运行结果:
3 总结
OutputStreamWriter、InputStreamReader分别为OutputStream、InputStream的低级输入输出流提供将字节转换成字符(或将字符转换成字节)的桥梁。
OutputStreamWriter中的StreamEncoder:
1、使用指定的或者默认的编码集将字符转码为字节
2、调用StreamEncoder自身实现的写入方法将转码后的字节写入到底层字节输出流中。
InputStreamReader中的StreamDecoder:
1、使用指定的或者默认的编码集将字节解码为字符
2、调用StreamDecoder自身实现的读取方法将解码后的字符读取到程序中。
在理解这两个流的时候要注意:java-io中只有将字节转换成字符的类,没有将字符转换成字节的类,原因很简单——字符流的存在本来就像对字节流进行了装饰、加工处理以便更方便的去使用。在使用这两个流的时候要注意:由于这两个流要频繁的对读取或者写入的字节或者字符进行转码、解码和与底层流的源和目的地进行交互、所以使用的时候要使用BufferedWriter、BufferedReader进行包装、以达到最高效率、和保护存储介质。
Java IO--字符流--InputStreamReader 和 OutputStreamWriter的更多相关文章
- Java Io 字符流
Java Io 字符流包含: 1. InputStreamReader 它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite 它是char流到byt ...
- Java IO: 字符流的Buffered和Filter
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...
- Java IO: 字符流的Piped和CharArray
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...
- java IO字符流
字节流:因为内存中数据都是字节,二进制数据. 字符流:方便处理文本数据.字符流是基于字节流的. ascii 编码表,并且各国都有自己的编码表. unicode码表,世界码表.优化后 utf-8码表. ...
- java -io字符流FileWrite操作演示
FileWriter字符输出流演示: /* * FiileWriter 字符流的操作 * FileWriter 的构造方法 可传递 File类型 还可以传递String类型 * * 方法 : * wr ...
- Java IO 转换流 字节转字符流
Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...
- java IO选择流的原则及其与IO流相关类的关系
1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...
- Java IO 嵌套流、文本的输入输出和存储
Java IO 嵌套流.文本的输入输出和存储 @author ixenos 1. 组合流过滤器(嵌套流) a) 跨平台文件分割符:常量字符串 java.io.File.seperator 等 ...
- Java IO 节点流 ByteArrayInput/OutputStream
Java IO 节点流 ByteArrayInput/OutputStream @author ixenos ByteArrayInputStream 包含一个内部缓冲区(字节数组byte[]),该缓 ...
随机推荐
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- 【转】Elasticsearch学习
原作者:铭毅天下,原文地址:blog.csdn.net/laoyang360 https://blog.csdn.net/wojiushiwo987/article/details/52244917 ...
- 使用AngularJS开发中的几个问题
1.AngularJS的模板绑定机制好像和其$http服务也有一定关系,如果用jQuery Ajax的返回值赋给$scope的作用域变量,整个绑定显示的节奏慢一个事件,神器果然麻烦啊. 2.对hidd ...
- 0基础一分钟入门Python
这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python ...
- php仿经典省市县三级联动
之前有个需求要写个类似省市县三级联动的页面,于是,网上找了点资料看了下,其实原理很简单: 当我们选择一级栏目中某条记录的时候,会获取该栏目的vaule值,并发起ajax请求,后台根据这个vaule值, ...
- Rafy 开源贡献中心 - 组织成立,并试运行一月小结
背景 最近两年,工作中虽然大量使用了 Rafy 框架作为各个产品.项目的开发框架.我是 2015 年的年中加入现在这家公司的,由于我个人工作太忙的缘故,一直没怎么编码,Rafy 框架底层的核心成长也比 ...
- flex调用JS报安全沙箱错误解决办法
flex调用JS方法弹窗时一般会报安全沙箱错误,只要将被调用的JS方法设置延时就可解决. function openKqQuery(){ window.showModalDialog("pa ...
- 安装ie时,报:此安装不支持您的操作系统的当前语言
打开注册表(win的"运行"栏键入 regedit 再按 OK )的HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Nls/ ...
- Reactor三种线程模型与Netty线程模型
文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...
- Java线程池中submit() 和 execute()方法的区别
两个方法都可以向线程池提交任务, execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorS ...