正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。

InputStreamReader 用于将字节输入流转换为字符输入流,
OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。
例 1
在 java.txt 中输出“一曲相思”,将 java.txt 保存为“UTF-8”的格式,然后通过字节流的方式读取,代码如下:

public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("D://java.txt");int b = 0;while ((b = fis.read()) != -1) {System.out.print((char) b);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}

输出结果为中文都是乱码。下面用字节数组,并通过字符串设定编码格式来显式内容,代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("I://work.txt");byte b[] = new byte[1024];int len = 0;while ((len = fis.read(b)) != -1) {System.out.print(new String(b, 0, len, "GBK"));}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

这时输出结果中文,但是当存储的文字较多时,会出现解码不正确的问题,且字节长度无法根据解码内容自动设定,此时就需要转换流来完成。代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;public class Test {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("I://work.txt");InputStreamReader isr=new InputStreamReader(fis,"GBK");int b=0;while ((b = isr.read()) != -1) {System.out.print((char)b);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

例 2
下面以获取键盘输入为例来介绍转换流的用法。Java 使用 System.in 代表标准输出,即键盘输入,但这个标准输入流是 InputStream 类的实例,使用不太方便,而且键盘输入内容都是文本内容,所以可以使用 InputStreamReader 将其转换成字符输入流,普通的 Reader 读取输入内容时依然不太方便,可以将普通的 Reader 再次包装成 BufferedReader,利用 BufferedReader 的 readLine() 方法可以一次读取一行内容。程序如下所示。

public static void main(String[] args) {try {// 将 System.in 对象转换成 Reader 对象InputStreamReader reader = new InputStreamReader(System.in);// 将普通的Reader 包装成 BufferedReaderBufferedReader br = new BufferedReader(reader);String line = null;// 利用循环方式来逐行的读取while ((line = br.readLine()) != null) {// 如果读取的字符串为“exit”,则程序退出if (line.equals("exit")) {System.exit(1);}// 打印读取的内容System.out.println("输入内容为:" + line);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}

上面代码第 4 行和第 6 行将 System.in 包装成 BufferedReader,BufferReader 流具有缓冲功能,它可以一次读取一行文本,以换行符为标志,如果它没有读到换行符,则程序堵塞,等到读到换行符为止。运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印出刚刚输入的内容。

流口水
输入内容:流口水

由于 BufferedReader 具有一个 readLine() 方法,可以非常方便地进行一次读入一行内容,所以经常把读入文本内容地输入流包装成 BufferedReader,用来方便地读取输入流的文本内容。

学到这里,大家可能有一个疑问:既然有字节流转字符流的转换流,那么为什么没有字符流转字节流的转换流呢?

这个问题一语指出了 Java 设计的遗漏之处,想一想字符流和字节流的差别。字节流比字符流的使用范围要更广,但字符流比字节流操作方便。如果有一个流已经是字符流了,也就是说,是一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,那么把它转换成字符流来处理就会更方便一些,所以 Java 只提供了将字节流转换成字符流的转换流,没有提供将字符流转换成字节流的转换流。

1.9 Java转换流:InputStreamReader和OutputStreamWriter相关推荐

  1. java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter

    java中所谓流通俗来讲就是数据源的传输,我们的文件,视屏,对象都可以叫做数据源,io将他们那转换为可以在不同程序中传输的数据,众所周知电脑存储是二进制,而处理时常遇到字节和字符的写入和写出,分别以8 ...

  2. Java 转换流 简介

    在以前的博文也提过了, java的Stream根据传输的最小单位, 可以分为字符流和字节流. 字节流应用面更广,  而字符流在某些情况(例如文本处理)会更加方便. 而在编程中,  有时程序接收到的是一 ...

  3. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)...

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  4. 2018-08-22字节字符转换流InputStreamReader+OutputStreamWriter+缓冲流Buffered+newLine换行方法...

    OutputStreamWriter类: 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表(一般是GBK和U ...

  5. 转换流InputStreamReader

    1.InputStreamReader转换流简介: 转换流:java.io.InputStreamReader: InputStreamReader extends Reader, 因此InputSt ...

  6. JAVA字符流InputStreamReader读取文本

    二.字符流 1.单个字符读取 public static void main(String[] args){try {InputStreamReader in = new InputStreamRea ...

  7. Java IO流学习总结七:Commons IO 2.5-FileUtils

    Java IO流学习总结七:Commons IO 2.5-FileUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/5497 ...

  8. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

    Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ar ...

  9. Java IO流学习总结二:File

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54581478 本文出自[赵彦军的博客] Java IO流学习总结一:输入输出流 J ...

最新文章

  1. 不要用 SELECT *
  2. sed命令详解--转
  3. JavaScript异步
  4. 大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构
  5. React开发(201):react代码分割之打包导出
  6. windows 给安装目录命令权限
  7. 让你更好的使用jQuery插件
  8. 浮动QQ在线客服代码,兼容各大浏览器
  9. 直线插补 圆弧插补 步进电机二维直线插补圆弧插补控制算法 C语言 STM32移植
  10. 我在腾讯看点的导师 Steven
  11. Java日志框架的使用
  12. 【沉舟侧畔千帆过,病树前头万木春】---OpenFeign的各种骚操作 -VS- 既生瑜何生亮的感叹,小Ribbon怎么办?
  13. 计算机主机的跳线怎么接,手把手教你台式机电脑主板跳线接法
  14. 通过修改hosts文件屏蔽网站的广告
  15. 二零二年度网络电话软件综合测评
  16. Spark中RDD、DataFrame和DataSet的区别与联系
  17. LinuxI/O多路复用转接服务器——epoll模型实现
  18. 关于bash -c “bash命令“ 和 python -c “python命令“的用法
  19. 【调剂】2023上海科技大学电子科学与技术祝智峰老师课题组招生
  20. 华清远见学习笔记—Level1—Day5—数组和字符串

热门文章

  1. Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果
  2. Crawler:爬虫之基于https+parse库实现爬取国内某知名招聘网上海、北京关于区块链职位的求职信息
  3. 安裝TA-Lib到想要罵髒話
  4. 『转载』在vs2008(2005)winform中,打开office文档
  5. seaJS简介和完整实例
  6. MySql 长时间读数据发生超时的异常 Mysql Reader Exception TimeOut expired
  7. 参加金蝶OperaMasks-WebFramework成都推广活动后的感想
  8. stdthread(5)并发atomic
  9. cmake (2)路径指令
  10. cmake (3)多个源文件aux_source_directory