news 2026/10/3 1:45:02

Java进阶学习笔记75——编码读取出现乱码的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java进阶学习笔记75——编码读取出现乱码的问题

如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码。

如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时会出现乱码。

package cn.chang.d3_transform_stream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.Reader; /** * 目标: 掌握不同编码读取乱码的问题 */ public class Test1 { public static void main(String[] args) { try ( // 1. 创建一个文件字符输入流与源文件接通 // 分析:代码编码是UTF-8; // 文件编码也是UTF-8,那就不会有乱码。 //Reader fr = new FileReader("io-app2/src/chang04.txt"); // 再新建chang06.txt,将编码改成GBK。然后再运行,就出现乱码。 Reader fr = new FileReader("io-app2/src/chang06.txt"); // 2. 把文件字符输入流包装成缓冲字符输入流 BufferedReader br = new BufferedReader(fr); ) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } }

运行结果:

代码分析:

文件时一个GBK的编码,1占一个字节,在GBK中汉字占一个两个字节。代码编码是UTF-8,1占一个字节,英文占一个字节,UTF-8,一个汉字占3个字节,最终肯定会出现乱码的。

文件的编码就是GBK,那字符输入转换流就可以解决字符乱码的问题。

InputStreamReader(字符输入转换流)

解决不同编码时,字符流读取文本内容乱码的问题。

解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转换成字符输入流,这样字符输入流中的字符就不乱码了。

代码:

package cn.chang.d3_transform_stream; import java.io.*; import java.nio.charset.StandardCharsets; /** * 目标:掌握字符输入转换流的作用 */ public class InputStreamReaderTest2 { public static void main(String[] args) { try( // 1. 得到文件的原始字节流(GBK的字节流形式) InputStream is = new FileInputStream("io-app2/src/chang06.txt"); // 2. 把原始的字节输入流按照指定的字符集编码转换成字符输入流 InputStreamReader isr = new InputStreamReader(is, "GBK"); // 3. 把字符输入流包装成缓冲字符输入流 BufferedReader br = new BufferedReader(isr); ) { String line; while( (line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } }

运行结果:

字符输出转换流:

需要控制写出去的字符使用什么字符集编码,该咋整?

1、调用String提供的getBytes方法解决?

2、可以使用字符输出转换流来实现。

OutputStreamWriter字符输出转换流:

作用:可以控制写出去的字符使用什么字符集编码。

解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。

代码:

package cn.chang.d3_transform_stream; import java.io.*; /** * 目标:掌握字符输出转换流的使用 */ public class OutputStreamWriterTest3 { public static void main(String[] args) { // 指定写出去的字符编码 try( // 1. 创建一个文件字节输出流 OutputStream os = new FileOutputStream("io-app2/src/chang07out.txt"); // 2. 把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。 Writer writer = new OutputStreamWriter(os, "GBK"); // 3. 把字符输出流包装成缓冲字符输出流 BufferedWriter bw = new BufferedWriter(writer); ) { bw.write("我是中国人"); bw.newLine(); bw.write("我爱中国"); bw.newLine(); } catch (Exception e) { e.printStackTrace(); } } }

运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:44:56

MySQL远程连接三道墙:权限、bind-address与防火墙实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:44:44

HBase二级索引实战指南:从查询痛点到底层原理与最佳实践

做大数据开发的兄弟应该都有这种经历:一张订单表几十亿行,按订单号点查毫秒级返回,结果产品过来说“帮我按手机号拉一下这个用户最近三个月的订单”,你一听心里咯噔一下——这玩意儿在HBase里就是全表扫描,跑个MapRedu…

作者头像 李华
网站建设 2026/10/3 1:42:02

【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥 ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进; 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王…

作者头像 李华