Java IO操作——字节-字符转换流(OutputStreamWriter、InputStreamReader)

矫情吗;* 2022-09-23 13:46 255阅读 0赞

学习目标

掌握OutputStreamWriter和InputStreamReader类的作用

具体学习内容:

OutputStreamWriter和InputStreamReader

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

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

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

一般在操作输入输出内容的时候就需要使用字节或字符流,但是有些时候需要将字符流变为字节流的形式,或者将字节流变为字符流的形式,所以,就需要另外一组转换流的操作类。

转换步骤:

如果以文件操作为例,则在内存中的字符数据需要通过OutputStreamWriter变为字节流才能保存在文件之中,读取的时候需要将读入的字节流通过InputStreamReader变为字符流

Center

在OutputStreamWriter类中需要一个字节流的对象:public OutputStreamWriter(OutputStream out)

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

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

读的时候,也可以使用字符流的形式读取字节流的文件。程序代码如下:

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

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

FileWriter和FileReader的说明

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

Center 1

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

Center 2

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

也就是说,最后不管如何,虽然是以字符的输出流形式操作了字节的输出流,但实际上还是以字节的形式输出,而字符的输入流,虽然以字符的形式操作,但实际上还是使用的字节流,也就是说,传输或者是从文件中读取数据的时候,文件中真正保存的数据永远是字节。

总结:

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

2、重点:操作的终端点实际上都是以字节的形式进行的。

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

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读

    相关 IO学习之字节字符测试

    > 一、基本概念 1、流:在Java中,将不同输入输出设备之间的数据传输抽象表述为流; 2、IO流:Java中的“流”都位于java.io包中,称作IO(输入输出)流;

    相关 字符Io字节Io

    字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为...