其他分享
首页 > 其他分享> > 转换流的原理与OutputStreamWriter介绍&代码实现与OutputStreamWriter介绍&代码实现

转换流的原理与OutputStreamWriter介绍&代码实现与OutputStreamWriter介绍&代码实现

作者:互联网

转换流的原理-InputStreamReader-OutputStreamWriter

编码引出的问题 --FileReader读取GBK格式的文件 会乱码 相当于ide默认的utf-8读取GBK编码的汉字 表示的字节不同会报错

FileReader可以读取IDE默认编码格式UTF-8的文件,
但是FileReader读取系统默认编码(中文系统默认GBK格式)会产生乱码

package Synchronized_demo.Synchroned_Demo01;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
FiLeReader可以读取IDE黑默t认编码格式(UTF-8)的文件FiLeReaderi读取系统黑认编码(中文GBK)会产生乱码
 */
public class Demo01_Dewl {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("G:\\xiangmu\\jichu\\wenjianjia\\b.txt");
        int len = 0;
        while ((len = reader.read())!=-1){
            System.out.println((char) len);
        }
        reader.close();
    }
}

 

注意:

FileReader

1.其实所有的底层都是FileInputStream来读的,先读取到字节 再FileReader(这个时候用的UTF-8来解码的来read的)把字节转换为字符(相当于解码)

但是如果存储的是GBK格式,则FileInputStream读取的字节时Gbk格式 但是FileReader仍然用UTF-8来,则会产生乱码(编码和解码不对应,会乱码所以FileReader只能读取ide默认格式编码的文件)

不用FileReader读了用InputStreamReader来读既可以查询默认的UTF-8又可以查询指定的码表比如GBK或者其他的

2.FileWriter

只能查询Ide的默认码表,吧字符转换为字节(编码把看懂的转换成看不懂的)还是会用到FileOutputStream依次把字节写入到硬盘中(只能写Utf-8)

如果要写GBK格式的文件

用OutputStreamWriter 既可以把字符转化为默认的又可以转化为指定的码表 ,然后FileOutputStream写入到硬盘中(注意FileOutputStream只能写UTF-8)

public class InputStreamReader extends Reader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用InputStreamReader中的一个read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

package Synchronized_demo;

import java.io.*;

/*
        java.io.Outputstreamlwriter extends writer
outputstreamwnriter:是字符流通向字节流的桥梁:可使用指定的 charset将要写入流中的字符编码成字节。(编码:把能看懂的变成看不懂)继续自父类的共性成员方法:
- void write(int c)写入单个字符。
- void write( char[ ] cbuf)写入字符数组。
- abstractvoid write(char[ ] cbuf,int off, int Len)写入字符数组的某一部分, off数组的开始索引,Len写的字符个数。- void iwrite( String str)写入字符串。
- void write(String str,int off, int len)写入字符串的某一部分, off字符串的开始索引, Len写的字符个数。- void flush()刷新该流的缓冲。
- void close()关闭此流,但要先刷新它。构造方法:
outputStreamwriter(OutputStream out)创建使用认字符编码的outputStreamwriter。
outputStreamwriter(OutputStream out,String charsetName)创建使用指定字符集的 outputStreamwriter。参数:
outputstream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName :指定的编码表名称,不区分大小写,可以是utf-8/UTF-8, gbk/GBK,. ..不指定默认使用UTF-8
使用步骤:
1.创建outputStreamlwriter对象,构造方法中传递字节输出流和指定的编码表名称
2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
4.释放资源
     */
public class Demo02OutStreamWitrew {
        public static void main(String[] args) throws IOException {
            //write_utf_8();
            write_GBK();
        }
         /*
            使用转换流outputstreamwriter写GBK格式的文件
             */
    private static void write_GBK() throws IOException {
        //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称
        OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\a.txt"),"GBK");
        //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
        os.write("你不好");
        //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
        os.flush();
        //4.释放资源
        os.close();
    }
            /*
            使用转换流outputstreamwriter写UTF-8格式的文件
             */

        private static void write_utf_8() throws IOException {
            //1.创建outputstreamiwriter对象,构造方法中传递字节输出流和指定的编码表名称
            OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("G:\\xiangmu\\jichu\\wenjianjia\\b.txt"),"UTF-8");
            //2.使用outputstreamriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
            os.write("你不好");
            //3.使用outputstreamvriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
            os.flush();
            //4.释放资源
            os.close();
        }
    }

 

标签:编码,OutputStreamWriter,字节,字符,FileReader,代码,GBK,介绍,write
来源: https://www.cnblogs.com/x3449/p/16473361.html