【IO流】22 - 字符流 - 转换流OutputStreamWrite和InputStreamReader

转换流

InputStreamReader

package cn.itcast.demo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 *  转换流
 *    java.io.InputStreamReader 继承 Reader
 *    字符输入流,读取文本文件
 *    
 *    字节流向字符的桥梁,将字节流转字符流
 *    
 *    读取的方法:
 *       read() 读取1个字符,读取字符数组
 *    
 *    技巧:  OuputStreamWriter写了文件
 *    InputStreamReader读取文件
 *    
 *    OuputStreamWriter(OuputStream out)所有字节输出流
 *    InputStreamReader(InputStream in) 接收所有的字节输入流
 *      可以传递的字节输入流: FileInputStream
 *    InputStreamReader(InputStream in,String charsetName) 传递编码表的名字
 */
public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
//        readGBK();
        readUTF();
    }
    /*
     *  转换流,InputSteamReader读取文本
     *  采用UTF-8编码表,读取文件utf
     */
    public static void readUTF()throws IOException{
        //创建自己输入流,传递文本文件
        FileInputStream fis = new FileInputStream("c:\\utf.txt");
        //创建转换流对象,构造方法中,包装字节输入流,同时写编码表名
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
        char[] ch = new char[1024];
        int len = isr.read(ch);
        System.out.println(new String(ch,0,len));
        isr.close();
    }
    /*
     *  转换流,InputSteamReader读取文本
     *  采用系统默认编码表,读取GBK文件
     */
    public static void readGBK()throws IOException{
        //创建自己输入流,传递文本文件
        FileInputStream fis = new FileInputStream("c:\\gbk.txt");
        //创建转换流对象,构造方法,包装字节输入流
        InputStreamReader isr = new InputStreamReader(fis);
        char[] ch = new char[1024];
        int len = isr.read(ch);
        System.out.println(new String(ch,0,len));
        
        isr.close();
    }
}

 字符输出流OutputStreamWrite

package cn.itcast.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
 *  转换流
 *    java.io.OutputStreamWriter 继承Writer类
 *    就是一个字符输出流,写文本文件
 *    write()字符,字符数组,字符串
 *    
 *    字符通向字节的桥梁,将字符流转字节流
 *    
 *    OutputStreamWriter 使用方式
 *     构造方法:
 *       OutputStreamWriter(OuputStream out)接收所有的字节输出流
 *       但是: 字节输出流:  FileOutputStream
 *       
 *      OutputStreamWriter(OutputStream out, String charsetName)
 *      String charsetName 传递编码表名字 GBK  UTF-8 
 *      
 *      OutputStreamWriter 有个子类,  FileWriter
 */
public class OutputStreamWriterDemo {
    public static void main(String[] args)throws IOException {
//        writeGBK();
        writeUTF();
    }
    /*
     * 转换流对象OutputStreamWriter写文本
     * 采用UTF-8编码表写入
     */
    public static void writeUTF()throws IOException{
        //创建字节输出流,绑定文件
        FileOutputStream fos = new FileOutputStream("c:\\utf.txt");
        //创建转换流对象,构造方法保证字节输出流,并指定编码表是UTF-8
        OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
        osw.write("你好");
        osw.close();
    }
    
    /*
     * 转换流对象 OutputStreamWriter写文本
     * 文本采用GBK的形式写入
     */
    public static void writeGBK()throws IOException{
        //创建字节输出流,绑定数据文件
        FileOutputStream fos = new FileOutputStream("c:\\gbk.txt");
        //创建转换流对象,构造方法,绑定字节输出流,使用GBK编码表
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        //转换流写数据
        osw.write("你好");
        
        osw.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

posted @ 2018-02-03 18:14  清风拂柳  阅读(203)  评论(0编辑  收藏  举报