Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.转换流概述

  我们之前介绍过FileWrite和FileReader两个字符类,FileReader是用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。 FileWriter是用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。 

  那么InputStreamReader和OutputStreamWriter到底是上面东西呢?其实它们就是我们今天要介绍的转换流。它是字节流到字符流的一种桥梁,可使用指定的字符集将要写入流中的字符编码成字节。操作的数据单位是:字符,换句话说,转换流就是将对字节的操作转换成对字符的操作。

二.OutputStreamWriter写文本文件

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

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

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter; public class OutputStreamDemo {
public static void main(String[] args) throws IOException {
writeGBK("yinzhengjie.gbk");
writeUTF8("yinzhengjie.utf-8");
} //使用UTF-8编码写入文件
public static void writeUTF8(String fileName) throws IOException {
//创建字节输出流,绑定文件
FileOutputStream fos = new FileOutputStream(fileName);
//创建转换流对象,构造方法保证字节输出流,并指定编码表是UTF-8
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
osw.write("尹正杰");
osw.close(); } //使用GBK编码写入文件
public static void writeGBK(String fileName) throws IOException {
//创建字节输出流,绑定数据文件
FileOutputStream fos = new FileOutputStream(fileName);
//创建转换流对象,构造方法,绑定字节输出流,使用GBK编码表
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
//转换流写数据
osw.write("尹正杰");
//关闭osw转换流后,就默认会关闭fos流。
osw.close();
} }

  注意:OutputStreamWriter还有一个子类,即FileWriter,它不能指定字符编码表,而是用系统默认的编码表。

三.InputSteamReader读取文本文件

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

  注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。InputStreamReader也有一个子类,即FileReaderr,它不能指定字符编码表,而是用系统默认的编码表。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note5; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader; public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
readGBK("yinzhengjie.gbk");
System.out.println("---------我是分割线------");
readUTF("yinzhengjie.utf-8"); }
//读取UTF-8的文件
public static void readUTF(String fileName) throws IOException {
//创建字节输出流,传递文本文件。
FileInputStream fis = new FileInputStream(fileName);
//创建转换流对象,构造方法中,包装字节输入流,同时写编码表名
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char[] buf = new char[4096];
int len ;
while((len = isr.read(buf)) != -1) {
System.out.println(new String(buf,0,len));
}
//释放资源
isr.close(); } //读取GBK编码文件
public static void readGBK(String fileName) throws IOException {
//创建输入流,传递文本文件。
FileInputStream fis = new FileInputStream(fileName);
//创建转换流对象,构造方法包装字节输出流
InputStreamReader isr = new InputStreamReader(fis,"GBK");
char[] buf = new char[4096];
int len ;
while(( len = isr.read(buf)) != -1 ) {
System.out.println(new String(buf,0,len));
}
//释放资源
isr.close();
}
} /*
以上代码执行结果如下:
尹正杰
---------我是分割线------
尹正杰
*/

四.转换流子类父类的区别

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

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

     InputStreamReader isr = new InputStreamReader(new FileInputStream("yinzhengjie.gbk"));//默认字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream("yinzhengjie.gbk"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("yinzhengjie.gbk"); //这三句代码的功能是一样的,其中第三句最为便捷。

  如果在Windows操作系统下,上面三行代码的功能是一样的,其中第三种读取方式最为便捷。注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?条件一:操作的是文件;条件二:使用默认编码;

Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)的更多相关文章

  1. Java基础IO类之字节数组流

    package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...

  2. Java 基础 IO流(转换流,缓冲)

    一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...

  3. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  4. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  5. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  6. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  7. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  8. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  9. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

随机推荐

  1. 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】

    1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...

  2. 20172321 2017-2018-2《Java程序设计》第三周学习总结

    20172321 2017-2018-2<Java程序设计>第三周学习总结 教材学习内容总结 第三章要点: 要点1 :String类.Random类.Math类和枚举型,这几个是很有用的并 ...

  3. iOS开发学习-cocoapods的配置安装

    安装coacoapods步骤: 在终端输入如下命令,升级ruby版本: sudo gem update —system 出现这个,标志着安装成功. 完成之后,再输入如下命令: gem sources ...

  4. 软工1816 · Beta冲刺(2/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成考试 确定历史记录页面与排行榜页面的前端页面风格 接下来的计划 & ...

  5. CountVectorizer,Tf-idfVectorizer和word2vec构建词向量的区别

    CountVectorizer和Tf-idfVectorizer构建词向量都是通过构建字典的方式,比如在情感分析问题中,我需要把每一个句子(评论)转化为词向量,这两种方法是如何构建的呢?拿CountV ...

  6. LeetCode题解:(19) Remove Nth Node From End of List

    题目说明 Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  7. 新手向:Vue 2.0 的建议学习顺序

    新手向:Vue 2.0 的建议学习顺序 尤雨溪   1 年前 注:2.0 已经有中文文档 .如果对自己英文有信心,也可以直接阅读英文文档.此指南仅供参考,请根据自身实际情况灵活调整.欢迎转载,请注明出 ...

  8. Python教程:丛入门到实践

    一.特殊用法的函数 name = "python very good" print(name.title()) 方法是python可对数据执行的操作.每个方法后面都跟着一对括号. ...

  9. Timing wheel心跳机制

    在web服务中,断开空闲连接是一种减少资源浪费的一种手段,由此就有了心跳机制来判断一个连接是否空闲. 一种简单粗暴的方式: 1. 服务端每个连接保存一个最后一次操作的时间戳,每次这个连接对应fd可读时 ...

  10. java追加写入txt文件

    整理了下网上的资料,数据追加写入txt文件有三种方式,见下面代码: 方法一: public void method1() { FileWriter fw = null; try { //如果文件存在, ...