转换流

转换流包括字符编码和字符集

字符编码和字符集
字符编码是计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数
转换之后的结果,按照某种规则,将字符储存到计算机中,称为编码,放置,将存储在计算机中的二进制数按照某种规则
解析显示出来,称为解码,比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号,反之,按照A规则存储
,在按照B规则解析,就会导致乱码现象
编码:字符->字节
解码:字节->字符
字符编码:就是一套自然语言的字符与二进制之间的对应规则
编码表:生活中文字和计算机中二进制的对应规则
字符集:也叫编码表,是一个系统支持的所有字符的集合,包裹各国家文字、标点符号、图形符号、数字等
计算机要准确的储存和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有
ASCII字符集,GBK字符集,Unicode字符集等

编码引出的问题
在一些软件中编码与windows系统的默认编码不是同一编码就会出现乱码问题
在windows系统中默认的编码是GBK编码,在IDEA中默认使用的是UTF-8编码所以就会出现乱码问题

解决乱码问题
就需要用到转换流InputStreamReader与OutStreamWriter,因为
FileReader只能查询默认码表,如果文件格式与编译器默认的编码不一样,那么就会出现乱码问题


OutStreamWriter

/*
java.io.OutStreamWriter extends Writer
OutStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节,
继承自父类的共性成员方法:
    void write(int c)写入单个字符
    void write(char[] chuf)写入字符数组
    abstract void write(char[] chuf,int off,int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数
    void write(String str)写入字符串
    void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数
    void flush()刷新该流的模块
    void close()关闭此流,但要先刷新

    构造方法:
        OutStreamWriter(OutputStream out)  创建使用默认字符编码的 OutStreamWriter
        OutStreamWriter(OutputStream out, String charsetName)      创建使用指定字符集的 OutStreamWriter
        参数:
            OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
            String charsetName:指定的编码表名称,不区分大小写
    使用步骤:
        创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
        使用OutputStreamWriter对象中的方法Write,把字符转换为字节存储到缓冲区中
        使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中
        资源释放 */

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


public class OutputStreamWrite {
    public static void main(String[] args) throws IOException{
        write_utf_8();
    }

    /* 使用转换流写utf-8格式的文件 */
    private static void write_utf_8() throws IOException{
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"),"utf-8");
            osw.write("你好");
            osw.flush();
            osw.close();
    }
}

 InputStreamRead

/*
InputStreamReader
java.io.InputStreamReader extends Reader
InputStreamReader 是字节流通向字符流的桥梁,他使用指定的charset读取字节并将其编码为字符
继承自父类的共性方法:
    int read()读取单个字节并返回
    int read(char[] chuf)一次读取多个字符,将字符读入数组
    void close() 关闭该流并释放与之相关的所有资源
构造方法
    InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader
    InputStreamReader(InputStream in,String charsetName) 创建使用指定字符集的 InputStreamReader
    参数:
        InputStream in: 字节输入流,用来读取文件中保存的字节
        String charsetName:指定的编码表名称,不区分大小写
    使用步骤
        创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
        使用InputStreamReader对象中的方法read读取文件
        释放资源
    注意事项
        构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码
*/
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class DemoInputStreamRead {
    public static void main(String[] args) throws IOException{
        read_utf_8();
    }
private static void read_utf_8() throws IOException{
    InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"),"utf-8");
    int len = 0;
    while((len = isr.read())!=-1){
        System.out.println((char)len);
    }
    isr.close();
}

}
原文地址:https://www.cnblogs.com/zhao-yang/p/14223766.html