转换流--OutputStreamWriter类与InputStreamReader类

12.4  转换流--OutputStreamWriter类与InputStreamReader类

整个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.         out.write("hello world");   // 使用字符流输出  
  13.         out.close();  
  14.     }  

程序执行结果:

 

范例:将字节输入流变为字符输入流
  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.         char[] c = new char[1024];  
  12.         int len = reader.read(c);  
  13.         reader.close();  
  14.         System.out.println(new String(c, 0, len));  
  15.     }  

U提示:FileWriter和FileReader的说明。

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

原文地址:https://www.cnblogs.com/mengfanrong/p/4291423.html