首页 > 技术文章 > JAVA-IO操作,字节-字符转换流

alsf 2017-04-28 00:02 原文

掌握OutputStreamWriter和InputStreamReader类的作用

一般操作输入输出内容的时候,就需要使用字节或字符流,但是,有些时候,需要将字符流变成字节流形式,或者字节流变成字符流形式。

所以,就需要另一种转换流的操作类。

OutputStreamWriter:是Writer的子类。将输出的字符流变成字节流:即将字符流的输入对象变成字节流输入对象。

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

OutputStreamWriter类的构造方法

OutputStreamWriter(OutputStream out) 
          创建使用默认字符编码的 OutputStreamWriter。

从构造方法可以看出,在outputStreamWriter类中需要一个字节流对象。

例如:将字节的文件输出流,以字符的形式输出。

package 类集;
import java.io.* ;
public class OutputStreamWriterDemo01{
    public static void main(String args[]) throws Exception    {    // 所有异常抛出
        File f = new File("d:" + File.separator + "test.txt") ;    
        Writer out = null ;    // 字符输出流
        out = new OutputStreamWriter(new FileOutputStream(f)) ;    // 字节流变为字符流,同时向上转型。
        out.write("hello world!!") ;    // 使用字符流输出
        out.close() ;
    }
};

读的时候,也可以使用字符流的形式读取字节流文件。

package 类集;
import java.io.* ;
public class InputStreamReaderDemo01{
    public static void main(String args[]) throws Exception{
        File f = new File("d:" + File.separator + "test.txt") ;    
        Reader reader = null ;
        reader = new InputStreamReader(new FileInputStream(f)) ;    // 将字节流变为字符流
        char c[] = new char[1024] ;
        int len = reader.read(c) ;    // 读取
        reader.close() ;    // 关闭
        System.out.println(new String(c,0,len)) ;
    }
};

输出结果:

hello world!!

但是,以上只是文件操作为例,因为outputStreamWriter中接收的类型是OutputStream,只要是字节输出流都可以使用字符的形式操作。

而InputStreamReader中接收的类型是InputStream。只要是字节输入流,都可以使用字符的输入流操作

 

FileWriter和FileReader类的说明

java.io 
类 FileWriter
java.lang.Object
  继承者 java.io.Writer
      继承者 java.io.OutputStreamWriter
          继承者 java.io.FileWriter

FilWriter不是Writer的子类,而是转换流的子类。

 

java.io 
类 FileReader
java.lang.Object
  继承者 java.io.Reader
      继承者 java.io.InputStreamReader
          继承者 java.io.FileReader

FileReader也不是Reader的子类,而是转换流的子类。

也就是说,不管如何,虽然是以字符的输出流形式,操作字节流输出流,但是实际上还是以字节的形式输出。

而字符的输入流虽然是以字符的形式操作,但是还是使用了字节流,也就是说,在传输或者从文件读取数据的时候,文件里真正保存的数据永远是字节。 

 

总结

1,一定要掌握两个转换类的作用

2,一定要明白的终端点实际上是以字节的形式进行的。

3,FileWriter和FileReader两个子类的定义,中间使用了转换类。

 

推荐阅读