现在的位置: 首页 > 综合 > 正文

转换流–OutputStreamWriter类与InputStreamReader

2018年01月26日 ⁄ 综合 ⁄ 共 1900字 ⁄ 字号 评论关闭

整个IO包实际上分为字节流和字符流,但是除了这两个流之外,还存在一组字节流-字符流的转换类。

OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。

InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。

(个人认为:不要管输入输出,其实就是流的转换,要么是字节转字符,要么是字符转字节,就这两种情况!)

如果以文件操作为例,则内存中的字符数据需要通过OutputStreamWriter变为字节流才能保存在文件中,读取时需要将读入的字节流通过InputStreamReader变为字符流,转换步骤如图12-7所示。

 
(点击查看大图)图12-7  转换步骤

从图12-7中可以清楚地发现,不管如何操作,最终全部是以字节的形式保存在文件中。

OutputStreamWriter的构造方法如下:

  1. public OutputStreamWriter(OutputStream out) 

范例:将字节输出流变为字符输出流

  1. package org.lxh.iodemo.changeiodemo;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.OutputStreamWriter;  
  5. import java.io.Writer;  
  6. public class OutputStreamWriterDemo01 {  
  7.     public static void main(String[] args)  throws Exception { // 所有的异常  
  8. 抛出  
  9.         File f = new File("d:" + File.separator + "test.txt");  
  10.         Writer out = null;  
  11.         out = new OutputStreamWriter(new  FileOutputStream(f));// 字节流变为  
  12. 字符流  
  13.         out.write("hello world");   // 使用字符流输出  
  14.         out.close();  
  15.     }  

程序运行结果:

 
范例:将字节输入流变为字符输入流
  1. package org.lxh.iodemo.changeiodemo;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.InputStreamReader;  
  5. import java.io.Reader;  
  6. public class InputStreamReaderDemo01 {  
  7.     public static void main(String[] args) throws  Exception { // 所有的异常抛出  
  8.         File f = new File("d:" + File.separator + "test.txt");  
  9.         Reader reader = null;  
  10.         reader = new InputStreamReader(new  FileInputStream(f));// 将字节流变为  
  11. 字符流  
  12.         char c[] = new char[1024];  
  13.         int len = reader.read(c);  
  14.         reader.close();  
  15.         System.out.println(new String(c, 0, len));  
  16.     }  

以上两个操作都是将字节流的操作类以字符流的形式进行输出和输入。

U提示:FileWriter和FileReader的说明。

从JDK文档中可以知道FileOutputStream是OutputStream 的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件中的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚地发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出流的。

抱歉!评论已关闭.