转换流

在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢?

OutputStreamWriter类

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

l  代码演示:

public static void writeCN() throws Exception {

//创建与文件关联的字节输出流对象

FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");

//创建可以把字符转成字节的转换流对象,并指定utf-8编码

OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");

//调用转换流,把文字写出去,其实是写到转换流的缓冲区中

osw.write("你好");//写入缓冲区。

osw.close();

}

OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

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

InputStreamReader类

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

l  代码演示

public class InputStreamReaderDemo {

public static void main(String[] args) throws IOException {

//演示字节转字符流的转换流

readCN();

}

public static void readCN() throws IOException{

//创建读取文件的字节流对象

InputStream in = new FileInputStream("c:\\cn8.txt");

//创建转换流对象

//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误

InputStreamReader isr = new InputStreamReader(in,"utf-8");

//使用转换流去读字节流中的字节

int ch = 0;

while((ch = isr.read())!=-1){

System.out.println((char)ch);

}

//关闭流

isr.close();

}

}

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

转换流和子类区别

发现有如下继承关系:

OutputStreamWriter:

|--FileWriter:

InputStreamReader:

|--FileReader;

父类和子类的功能有什么区别呢?

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

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

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

条件:

1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

java 文件转换成流_java -IO流_转换流相关推荐

  1. java 时间转换成字符串_java 获得系统时间 转换成字符串

    1.long字符串转换成yyyy-MM-dd HH:mm:ss 格式输出 /** * 将长时间格式字符串转换为字符串 yyyy-MM-dd HH:mm:ss * @return */ public s ...

  2. java汉字转换成拼音_Java代码将汉字转换成拼音

    package com.sucre; //导入的jar包 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pi ...

  3. java怎么把毫秒转换成天数_java – 如何将毫秒转换成小时和数天?

    下面的代码执行您需要的数学,并构建生成的字符串: private static final int SECOND = 1000; private static final int MINUTE = 6 ...

  4. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流

    一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...

  5. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  6. java文件打包jar文件_把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  7. java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...

    理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么 最近在看<深入理解Java虚拟机>弄明白了很多java的底层知识,决定分几部分总结下,从.java文件编译,到 ...

  8. java文件打包jar文件_如何把JAVA文件打包成jar文件

    本文讲解了把java文件打包成jar文件的方法,经测试可行.由于作者没时间用批处理文件进行操作的方法没有列出来. (1)把一个java文件打包到当前目录   javac –d . *.java (2) ...

  9. java文件打包成jar文件_将java文件打包成jar包步骤

    将mypackage包中的FrameDemo.java文件打包成可执行成jar包 步骤1:先将程序中所有类打包成一个包 编译mypackage包FrameDemo.java文件,将类文件存入D盘Jar ...

  10. 将图片直接转换成xml文件_如何将jpg在线转换成pdf?jpg图片可以转换成pdf吗?

    可不要以为jpg就一定只是一张简单的图片,一张图片中可以包含的信息是很多的,除了有景象之外,也可能会有文字,有表格.当然,我们今天要讨论的,并不是一张jpg的图片中可能会存在哪些信息,而是要如何将jp ...

最新文章

  1. java中相同名字怎么声明,Java中,同一个类中的两个或两个以上的方法可以有同一个名字,只要他们的参数声明不同即可...
  2. 华山论剑之浅谈iOS的生产线 工厂模式
  3. c++ template笔记(2)模板类
  4. Eclipse——WindowBuilder下载错误导致的安装失败解决方案
  5. VBS常用函数及功能
  6. md5模式 签名_MD的完整形式是什么?
  7. 语法糖 python_Python___语法糖
  8. linux 分割pdf,PDFBox分割PDF文档
  9. TensorFlow2.0:单层感知机梯度计算
  10. Ubuntu10.04下配置和使用JDK-Mysql-Tomcat-SVN
  11. WPF高性能绘图之DrawingCanvas、DrawingVisual、Button的同时使用
  12. 2020央行全面降准,货币政策操作仍有较大空间
  13. Library(terminalio) to read the password securely from commandline is not found
  14. 淘宝直通车托管公司怎么样
  15. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)
  16. ps 选区工具的使用
  17. netflix为什么叫网飞_没有商业中断:为什么世界杯比Netflix时代的NFL感觉更现代...
  18. WiFi模块的AP模式和STA模式
  19. 用calc()绘制手机图案解锁的九宫格样式
  20. 对MySQL 8.0分区表探索总结

热门文章

  1. Ubuntu18.04安装后要做的事
  2. 基于unity+HTC VIVE的室内漫游交互(教你如何“无代码”VR交互)
  3. android之在app图标添加角标,Android之在app图标添加角标
  4. BEA WebLogic Workshop 8.1中文语言包
  5. Elasticsearch文档CURD操作
  6. linux ftp下载文件到本地,如何使用get指令利用FTP下载文件到本地
  7. 计算机毕业设计基于asp.net的大学生交友网站
  8. 考研英语 - word-list-50
  9. RPG类型的游戏革命
  10. 电路习题解答 第五章 5-1、5-2