文档章节

InputStreamReader 和 OutputStreamWriter类用法简介。

清风伴月
 清风伴月
发布于 2016/08/14 16:08
字数 930
阅读 11
收藏 0
点赞 0
评论 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();
  } 
 }
}

复制代码

© 著作权归作者所有

共有 人打赏支持
清风伴月
粉丝 1
博文 129
码字总数 255659
作品 0
海淀
程序员
流之阅读器和书写器(简介)

Java的内置字符集是Unicode的UTF-16编码。Java提供了一组API来读/写字符。注意这里是字符而不是字节。java.io.Reader类指定读取字符的API。java.io.Writer指定写字符的API。字节流与字符流相...

柳哥 ⋅ 2014/10/16 ⋅ 0

Java 读写文件

import java.io.File; import java.io.FileWriter; import java.io.IOException; /** 对文本文件进行读写操作 */ public class WriteAndReadText { 文本文件所在的目录 读取文本内容 @param......

倚小丁 ⋅ 2010/11/04 ⋅ 0

Java IO--字符流--InputStreamReader 和 OutputStreamWriter

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

黑色code ⋅ 2016/12/15 ⋅ 0

从安卓开发谈设计模式

1、单例模式 : Aplication 对象 2、Template 模式:集成Activity类后,必须重写父类的方法,并且 父类的方法调用会按一定的顺序自动被调用(onCreate onResume onStop onDestroy) 3、适配器...

在水一方发盐人 ⋅ 2016/11/17 ⋅ 0

Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

一.Properties 类(java.util) 概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型 (String),该集合提供...

老胡2015 ⋅ 2017/06/26 ⋅ 0

写一个方法进行文件的复制

java中实现文件内的复制,需要新建文件的方法: File file=new File("wubin.txt"); 并且没有这个文件,那么需要将这个文件,创造出来: file.createNewFile(); 当然也可以直接在文件流里面直接...

吴斌大大 ⋅ 2015/03/29 ⋅ 0

PrintWriter 的Write()方法和println()方法有何细微的区别?

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

浪漫的菜鸟 ⋅ 2011/03/30 ⋅ 11

Socket类的getter和setter方法

在Java类中,getter和setter方法占了很大的比重。由于Java中没有定义属性的关键字;因此,getter和setter方法用于获得和设置Java类的属性值;如getName和setName方法用于设置name属性的值。如...

Mr&Cheng ⋅ 2013/01/24 ⋅ 0

IO流

一、IO流 1、概述:IO流用来处理设备之间的数据传输(读写,复制) 2、分类: 按照流向分:输入流(读数据),输出流(写数据); 按照数据类型:字节流,字符流 字节输入流:InputStream(抽象类) ---...

走了丶 ⋅ 2017/08/17 ⋅ 0

java(十)IO流

例: 关于键盘录入 package day22; import java.io.IOException; import java.io.InputStream; public class ReadKey { /** * 关于键盘录入。 */ public static void main(String[] args) th......

一只小恶狼 ⋅ 2017/06/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 21分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 41分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 49分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 58分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部