转换流

转换流

为什么需要使用转换流

//FileReader和BufferedReader从文本文件中读取数据时使用码表默认是GBK码表,不能修改,
//如果文本文件的编码不是GBK时,就不能使用GBK方式去读取,否则会出现乱码,
//此时需要指定编码去读取文件的内容,只能使用转换流,只有转换流才能指定码表。

转换流概述  

  • 本质就是字符流,只能操作文本文件。

转换流的作用

  • 字节流和字符流相互转换的桥梁。

转换流的分类  

  • OutputStreamWriter

  • InputStreamReader

OutputStreamWriter类概述
* 继承Writer类
* 本质是一个字符流,只能操作文本文件。
* 是字符流通向字节流的桥梁。

OutputStreamWrtier类构造方法

     OutputStreamWriter(OutputStream out) 
        * 根据字节流创建字符转换输出流。使用默认码表:GBK
        * 可以传递的字节输出流:FileOutputStream,BufferedOutputStream
     OutputStreamWriter(OutputStream out, String charsetName) 
        * 根据字节流创建字符转换输出流。可以通过charsetName指定码表
        * 可以传递的字节输出流:FileOutputStream,BufferedOutputStream

OutputStreamWrtier类成员方法

 write(); 可以输出一个字符,字符数组,字符串。

字符流转字节流的过程

* 先通过OutputStreamWrtier类查询指定的码表,将要输出的内容转换字节
* 然后将转换到的字节交给OutputStream字节输出流输出到目标文件中。

public class OutputStreamWriterDemo {
    public static void main(String[] args) {
        writeGBK();
        writeUTF8();
    }
    
    // 使用UTF8方式输出数据
    public static void writeUTF8() {
        try(
            // 创建字符转换输出流对象
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt"),"UTF-8");
            ){
            // 调用方法输出数据
            osw.write("你好");
        }catch(Exception e) {
            
        }
    }
    
    // 使用GBK方式输出数据
    public static void writeGBK() {
        try(
            // 创建字符转换输出流对象
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
            ){
            // 调用方法输出数据
            osw.write("你好");
        }catch(Exception e) {
            
        }
    }
}

InputStreamReader类概述

继承Reader,本质就是一个字符输入流。只能从文本文件中读取数据。

是字节流转字符流的桥梁。    

InputStreamReader类构造方法

InputStreamReader(InputStream in);

使用默认码表:GBK 创建字符转换输入流对象 

InputStreamReader(InputStream in,String charsetName);

使用指定码表创建字符转换输入流对象。

InputStreamReader类成员方法

read(); 可以读取一个字符,一个字符数组

字节流转字符流的过程

  * 先由InputStream的对象去从目标文件中读取数据,读取到的都是字节数
    * 然后将读取到的字节交给InputStreamReader的对象去查询指定的码表得到对应字符。

public class InputStreamReaderDemo {
    public static void main(String[] args) {
        readGBK();
        readUTF8();
    }
    
    /**
     * 使用UTF8方法读取文本文件内容
     */
    private static void readUTF8() {
        try(
                // 创建字符转换输入流对象
                InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"),"utf8");
                ){
            // 定义字符数组
            char[] buf = new char[1024];
            // 读取内容
            int len = isr.read(buf);
            System.out.println(new String(buf,0,len));
        }catch(Exception e) {}
        
    }

    /**
     * 使用GBK方法读取文本文件内容
     */
    private static void readGBK() {
        try(
                // 创建字符转换输入流对象
                InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"),"GBK");
                ){
            // 定义字符数组
            char[] buf = new char[1024];
            // 读取内容
            int len = isr.read(buf);
            System.out.println(new String(buf,0,len));
        }catch(Exception e) {}
        
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值