转换流InputStreamReader & OutputStreamWriter

本文详细介绍了转换流InputStreamReader与OutputStreamWriter的应用场景与实现方法。针对不同编码格式的文件读写过程中可能出现的乱码问题,文章提供了具体的解决方案及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转换流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();

    }
}

转载于:https://www.cnblogs.com/zhuobo/p/10660982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值