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


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

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

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

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

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

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

     4、字符输入转换流

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

    • 会乱码

     4.2、如何解决呢?

    • 使用字符输入转换流
    • 可以提取文件(GBK)的原始字节流,原始字节不会存在问题
    • 然后把 字节流 以指定编码转换成 字符输入流,这样字符输入流中的字符就不乱码了
    1. package com.csdn.d6_transfer_stream;
    2. import java.io.*;
    3. import java.nio.charset.StandardCharsets;
    4. public class InputStreamReaderDemo01 {
    5. public static void main(String[] args) throws IOException {
    6. InputStream is = new FileInputStream("src/com/csdn/d6_transfer_stream/InputStreamReaderDemo01.java");
    7. //把原始 字节流 转换成 字符输入流
    8. //以指定的UTF-8的方式转换成字符流。完全的解决了乱码问题
    9. Reader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
    10. BufferedReader br = new BufferedReader(isr);
    11. String line;
    12. while ((line = br.readLine()) != null) {
    13. System.out.println(line);
    14. }
    15. }
    16. }
    • 字符输入转换流:InputStreamReader,可以把原始的 字节流 按照编码转换成 字符输入流
    构造器说明
    public InputStreamReader(InputStream is)可以把原始的 字节流 按照代码默认编码转换成 字符输入流 。几乎不用,与默认的FileReader一样
    public InputStreamReader(InputStream is,String charset)可以把原始的 字节流 按照指定编码转换成 字符输入流,这样 字符流 中的字符就不乱码了(重点)

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

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

    1、 字符输出转换流

    • 可以把 字符 以指定编码获取 字节 后再使用字节输出流写出去
    • “我爱你中国”.getBytes(编码)
    • 也可以使用字符输出转换流实现
    1. package com.csdn.d6_transfer_stream;
    2. import java.io.*;
    3. import java.nio.charset.StandardCharsets;
    4. public class OutputStreamWriterDemo02 {
    5. public static void main(String[] args) throws IOException {
    6. //1.定义一个字节输出流
    7. OutputStream os = new FileOutputStream("src\\csdn.txt");
    8. //2.把原始的 字节输出流 转换成 字符输出流
    9. Writer osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);
    10. //3.把低级的 字符输出流 包装成 高级的缓冲字符输出流
    11. BufferedWriter bw = new BufferedWriter(osw);
    12. bw.write("我爱中国1");
    13. bw.write("我爱中国2");
    14. bw.write("我爱中国3");
    15. bw.close();
    16. }
    17. }
    • 字符输出转换流:OutputStreamWriter,可以把 字节 输出流按照指定编码转换成 字符 输出流
    构造器说明
    public OutputStream(OutputStream os)可以把原始的 字节 输出流按照代码默认编码转换成 字符 输出流。几乎不用。
    public OutputStream(OutputStream os,String charset)可以把原始的 字节 输出流按照指定编码转换成 字符 输出流(重点)

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

    • public OutputStreamWriter(OutputStream os,String charset)
    • 可以指定编码把 字节 输出流转换成 字符 输出流,从而可以指定写出去的字符编码
  • 相关阅读:
    linux守护进程
    纯CSS实现炫酷文本阴影效果
    瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了!
    如何写好B端产品的技术方案?
    react 路由拦截通过tocken进行简单拦截
    【C++模拟实现】哈希与unorder_set和unorder_map关联式容器的模拟实现
    Ffmpeg分布式视频转码问题总结
    Spring事件ApplicationEvent源码浅读
    使用spring-boot-dependencies代替spring-boot-starter-parent,jar启动报错 没有主清单属性解决
    Docker到底是什么
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133275664