转换流InputStreamReader & OutputStreamWriter

转换流InputStreamReader & OutputStreamWriter

比如当使用FileReader读取文件时,可以读取IDE默认的UTF-8编码的文件,但是当有一个文件是GBK文件时,使用FileReader读取文件会出现乱码,因此需要转换流,将编码格式进行转换。

转换流原理:

比如GBK是使用2个字节存储一个中文,而UTF-8使用3个字节存储一个中文文字。文件字符输入流FileRead读取文件时,事实上是调用了文件字节输入流FileInputStream,FileReader在读取文件时会按照IDE的默认编码表UTF-8去解码,当文件本来就是按照UTF-8编码的时候,解码就当然不会出现问题;但是当文件本来是按照GBK编码时,编码解码的方式不一样就会出现乱码。但是当使用转换流InputStreamReader & OutputStreamWriter读取和写入文件而不是FileReader或者FileWriter时,这两个流可以指定编码解码方式,这就可以避免出现乱码现象。

1、OutputStreamWriter

java.util.OutputStreamWriter extends Writer

方法 作用
void write(int c) 写入单个字符
void write(char[] cbuf) 写入字符数组
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,索引off开始,len的长度
void write(String str) 写入字符串
void write(String str, int off, int len) 写入字符串的某个部分
void flush() 刷新该流的缓冲
void close() 关闭流,释放资源

构造方法

构造方法 作用
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的OutputStreamWriter对象
OutputStreamWriter(OutputStream out, Sting charsetName) 创建使用指定字符编码的OutputStreamWriter对象

参数:

OutputStream out:字节输出流,可以使用FileOutputStream对象,用来写转换之后的字节到文件中

Sting charsetName:指定的编码方法,不区分大小写,可以是utf-8/UTF-8,gbk/GBK.......不指定就使用默认的UTF-8

使用步骤

  • 创建OutputStreamWriter对象,构造方法中传递字节输出流和编码方式
  • 使用OutputStreamWriter对象的write方法,把字符转换为字节存储到缓冲区中
  • 使用OutputStreamWriter兑现的flush方法,将缓冲区的字符数据刷新到文件中(这是一个使用OutputStream的过程)
  • 使用close方法释放资源
package cn.zhuobo.day15.aboutOutputStreamWriter;

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

public class Demo01OutputStreamWriter {
    public static void main(String[] args) throws IOException {

        write_utf_8();
        write_gbk();
    }

    private static void write_gbk() throws IOException {// 指定编码格式
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day15-code/gbk.txt"), "gbk");
        osw.write("我是GBK文件");
        osw.flush();
        osw.close();
    }

    public static void write_utf_8() throws IOException {// 不指定编码格式,使用默认的Unicode-utf-8
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day15-code/utf-8.txt"));
        osw.write("我是uft-8文件");
        osw.flush();
        osw.close();
    }
}

2、InputStreamReader

java.io.InputStreamReader extends Reader

可以继承自使用过Reader的方法

方法 作用
int read() 读取单个字符并且返回
int read(char[] cbuf) 一次读取多个字符,存储进数组里
void close() 关闭该流,并释放所有与之关联的资源

构造方法

构造方法 作用
InputStreamReader(InputStream in) 创建一个使用默认字符编码的InputStreamReader对象
InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符编码集的InputStreamReader对象

参数

InputStream in:字节输入流,可以使用FileInputStream,用来读取保存在文件中的字节

String charsetName:指定的编码方法,不指定就默认使用UTF-8

使用步骤

  • 创建InputStreamReader对象,构造方法传递字节输入流,以及编码方式,要注意的是指定的编码方式要和文件本来的编码方式一致,构造就会乱码
  • 使用InputStreamReader对象的read方法读取字节
  • 使用close方法释放资源
package cn.zhuobo.day15.aboutInputStreamReader;

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

public class Demo01InoutStreamReader {
    public static void main(String[] args) throws IOException {
        read_utf_8();
        read_gbk();
    }

    private static void read_gbk() throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day15-code/gbk.txt"), "gbk");
        int len = 0;
        while((len = isr.read()) != -1) {
            System.out.print((char)len);
        }
        isr.close();
        System.out.println();
    }

    private static void read_utf_8() throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day15-code/utf-8.txt"), "utf-8");
        int len = 0;
        while((len = isr.read()) != -1) {
            System.out.print((char)len);
        }
        isr.close();
        System.out.println();

    }
}

猜你喜欢

转载自www.cnblogs.com/zhuobo/p/10660982.html