文档章节

InputStreamReader 和 OutputStreamWriter类用法简介。

清风伴月
 清风伴月
发布于 2016/08/14 16:08
字数 930
阅读 18
收藏 0

首先说明下字节流和字符流:

FileReader,FileWriter 是读字符的,1个字符是2个字节,16位
OutputStream ,InputStream是读字节的,1个字节是8位

如果要读汉字,一个汉字是2个字节,用InputStream读就把汉字折成两半,不太适合吧。

字符流主要读文本效率比较高。
字节流主要读二进制文件,图片 ,音频,视频等,就是为了防止出现读取的单位放大,出现无法还原本程序的目的


如果把文件按字节读取,然后按照UTF-8的格式编码显示,怎么办?
InputStreamReader就有这功能,对原字节再编码的过程。

-----------------------------------------------------------------------------------

下面切入正题:

转换流:InputStreamReader和OutputStreamWriter

一。InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等

要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

二。OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积

为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

 BufferedWriter out  = new BufferedWriter(new OutputStreamWriter(System.out));

------------------------------------------------------------------------------------------

(1)Reader和Writer类(文本字符流读写类):提供的对字符流处理的类,它们为抽象类。一般通过其子类来实现。
(2)InputStreamReader(InputStream in) 和OutputStreamWriter(OutputStream out):它们可以使用指定的编码规范并基于字节流生成对应的字符流。

(3)BufferedReader(InputStreamReader isr, int size) 和 BufferedWriter(OutputStreamWriter osr, int size):
为提高字符流的处理效率,可以采用缓冲机制的流实现对字符流作成批的处理,避免了频繁的从物理设备中读取信息 。

示例一:

复制代码

package com.zlc.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class StreamReaderWriterDemo {
 public static void main(String[] args) {
  try { 
   //1.从文本文件中获得输入字节到字节输入流中
   FileInputStream fis = new FileInputStream("f:\\01.txt"); 
   
   //2. 为FileInputStream加上字符处理功能
   InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
   
   //3.为了达到最高效率,可要考虑在 BufferedReader内包装 InputStreamReader
   BufferedReader bufr = new BufferedReader(isr);
   
   
   //4.创建将数据写入到文本文件的文件输出流
   FileOutputStream fos = new FileOutputStream("f:\\02.txt"); 
   
   //5.为FileOutputStream加上字符处理功能
   OutputStreamWriter osw = new OutputStreamWriter(fos); 
   
   //6.为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
   BufferedWriter bufw = new BufferedWriter(osw);
   
   int ch = 0;
   
   // 以字符方式显示文件内容 
   while((ch = bufr.read()) != -1) {
    System.out.print((char)ch); 
    osw.write(ch); 
   }
   if(bufr!=null)
    bufr.close();
   if(bufw!=null)
    bufw.close();
  } catch(ArrayIndexOutOfBoundsException e) {
   e.printStackTrace();
  } catch(IOException e) {
   e.printStackTrace();
  } 
 }
}

复制代码

在通常编码时,下面的方式更为常用。下面的代码是对上面进行了简化。
示例二:

复制代码

package com.zlc.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class StreamReaderWriterDemo2 {
 public static void main(String[] args) {
  try { 
   
   BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("f:\\01.txt")));
   
   BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("f:\\02.txt")));
   
   int ch = 0;
   
   // 以字符方式显示文件内容 
   while((ch = bufr.read()) != -1) {
    System.out.print((char)ch); 
    bufw.write(ch); 
   }
   if(bufr!=null)
    bufr.close();
   if(bufw!=null)
    bufw.close();
  } catch(ArrayIndexOutOfBoundsException e) {
   e.printStackTrace();
  } catch(IOException e) {
   e.printStackTrace();
  } 
 }
}

复制代码

© 著作权归作者所有

共有 人打赏支持
上一篇: HashMap详解
下一篇: APK签名
清风伴月
粉丝 1
博文 129
码字总数 255659
作品 0
海淀
程序员
私信 提问
Java基于代码实战的字符流父类、字符转换流、缓冲字符流、过滤流

Java输入输出(I/O)流的知识回顾: 补充:因为这篇文章是基于上一篇的延续,因此将上一篇进行简单的回顾,以便理解本节内容。 1)输入输出(I/O)流分类:共分为字节型输入输出流和字符型输入...

孟飞阳
2017/10/20
0
0
Java IO--字符流--InputStreamReader 和 OutputStreamWriter

今天继续学习字符流的子类!!!! 先来熟悉一下适配器设计模式:(手写的,,嘿嘿) 因为据说InputStreamReader 和OutputStreamWriter采用了适配器模式(现在我还没能理解,先记住) 1 Inpu...

黑色code
2016/12/15
10
0
【IO】- IO 体系中的设计模式-适配器模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zt15732625878/article/details/82698777 前言 之前的博客说到了适配器模式的概念和UML类图,这次来聊下IO中的...

大白快跑8
09/14
0
0
JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52435993 JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 Fi...

Aduroidpc
2016/09/04
0
0
PrintWriter 的Write()方法和println()方法有何细微的区别?

简单化德把问题说一下吧!最近试着编写socket聊天小软件。 在服务器端和客户端产生一个Socket 后, 两边各自用getIputStream()和getOutputStream()方法,构造各自的输入输出流。 其中服务器端...

浪漫的菜鸟
2011/03/30
21.9K
11

没有更多内容

加载失败,请刷新页面

加载更多

基于vue2定义自己的图表echart组件

先安装echarts cnpm i echarts -S,然后定义父组件 <template> <div> <echarts :option="echartOpion"></echarts> </div></template><script> import echarts from './e......

莫沫达
8分钟前
0
0
详解CSS的Flex布局

本文由云+社区发表 Flex是Flexible Box 的缩写,意为"弹性布局",是CSS3的一种布局模式。通过Flex布局,可以很优雅地解决很多CSS布局的问题。下面会分别介绍容器的6个属性和项目的6个属性。每...

腾讯云加社区
20分钟前
0
0
一些感想

人生的意义是什么 不知不觉已人到中年,其实上学的时候经常会思考这些问题————大概是因为闲,大学毕业参加工作经历的事情越来越多,反而不会去想这些缥缈的事情了,也许是因为最近看了一...

looqy
20分钟前
0
0
迭代器模式 Iterator 行为型 设计模式(二十)

  在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义      如果给定一个数组,我们可以通过for循环来遍历这个数组,这种遍历就叫做迭代      对于...

SEOwhywhy
29分钟前
2
0
【 58沈剑 架构师之路】InnoDB,5项最佳实践,知其所以然

缓存讲了一个月《缓存架构,一篇足够》。今天,开始写数据库。 第一篇,说说MySQL两个最常用的存储引擎,MyISAM和InnoDB。照自己的理解,把一些知识点总结出来,不只说知识点,多讲“为什么”...

张锦飞
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部