转换流(解决代码与文件编码不一致读取乱码的问题)(InputStreamReader,OutputStreamWriter)

1、之前我们使用字符流读取中文是否有乱码?

  • 没有的,因为代码编码和文件编码都是UTF-8

2、如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?

  • 会乱码
  • 文件编码和读取的编码必须一致才不会乱码

3、字符流直接读取文本内容

  • 必须文件和代码编码一致才不会乱码
  • 如果文件和代码编码不一致,读取将出现乱码

 4、字符输入转换流

 4.1、如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码码?

  • 会乱码

 4.2、如何解决呢?

  • 使用字符输入转换流
  • 可以提取文件(GBK)的原始字节流,原始字节不会存在问题
  • 然后把 字节流 以指定编码转换成 字符输入流,这样字符输入流中的字符就不乱码了
package com.csdn.d6_transfer_stream;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class InputStreamReaderDemo01 {
    public static void main(String[] args) throws IOException {
        InputStream is = new FileInputStream("src/com/csdn/d6_transfer_stream/InputStreamReaderDemo01.java");

        //把原始 字节流 转换成 字符输入流
        //以指定的UTF-8的方式转换成字符流。完全的解决了乱码问题
        Reader isr = new InputStreamReader(is, StandardCharsets.UTF_8);

        BufferedReader br = new BufferedReader(isr);

        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}
  • 字符输入转换流:InputStreamReader,可以把原始的 字节流 按照编码转换成 字符输入流
构造器 说明
public InputStreamReader(InputStream is) 可以把原始的 字节流 按照代码默认编码转换成 字符输入流 。几乎不用,与默认的FileReader一样
public InputStreamReader(InputStream is,String charset) 可以把原始的 字节流 按照指定编码转换成 字符输入流,这样 字符流 中的字符就不乱码了(重点)

4.3、字符输入转换流InputStreamReader作用:

  • 可以解决字符流读取不同编码乱码的问题
  • public InputStreamReader(InputStream is,String charset)

1、 字符输出转换流

  • 可以把 字符 以指定编码获取 字节 后再使用字节输出流写出去
  • “我爱你中国”.getBytes(编码)
  • 也可以使用字符输出转换流实现
package com.csdn.d6_transfer_stream;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class OutputStreamWriterDemo02 {
    public static void main(String[] args) throws IOException {
        
        //1.定义一个字节输出流
        OutputStream os = new FileOutputStream("src\\csdn.txt");

        //2.把原始的 字节输出流 转换成 字符输出流
        Writer osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);

        //3.把低级的 字符输出流 包装成 高级的缓冲字符输出流
        BufferedWriter bw = new BufferedWriter(osw);

        bw.write("我爱中国1");
        bw.write("我爱中国2");
        bw.write("我爱中国3");

        bw.close();
    }

}
  • 字符输出转换流:OutputStreamWriter,可以把 字节 输出流按照指定编码转换成 字符 输出流
构造器 说明
public OutputStream(OutputStream os) 可以把原始的 字节 输出流按照代码默认编码转换成 字符 输出流。几乎不用。
public OutputStream(OutputStream os,String charset) 可以把原始的 字节 输出流按照指定编码转换成 字符 输出流(重点)

2、字符输出转换流OutputStreamWriter的作用?

  • public OutputStreamWriter(OutputStream os,String charset)
  • 可以指定编码把 字节 输出流转换成 字符 输出流,从而可以指定写出去的字符编码

你可能感兴趣的:(#,File,和,IO,流,java,开发语言)