一、转换流
1、引出问题:不同编码读取时会乱码
(1)如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
(2)如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!
1.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/Test1.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.itheima.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( "study18-io-app2/src/itheima06.txt" ); // 2、把文件字符输入流包装成缓冲字符输入流 BufferedReader br = new BufferedReader(fr); ) { String line; while ((line = br.readLine()) != null ) { System. out .println(line); } } catch (Exception e) { e.printStackTrace(); } } } |
2、字符输入转换流
2.1、InputStreamReader(字符输入转换流)
(1)解决不同编码时,字符流读取文本内容乱码的问题。
(2)解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
2.1.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/InputStreamReaderTest2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.itheima.d3_transform_stream; import java.io.*; /** * 目标:掌握字符输入转换流的作用 */ public class InputStreamReaderTest2 { public static void main(String[] args) { try ( // 1、得到文件的原始字节流(GBK的字节流形式) InputStream is = new FileInputStream( "study18-io-app2/src/itheima07.txt" ); // 2、把元素的字节输入流按照指定的字符集编码转换成字符输入流 Reader 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(); } } } |
3、字符输出转换流
3.1、需要控制写出去的字符使用什么字符集编码,该咋整?
(1)调用String提供的getBytes方法解决?
1 2 | String data= "我爱你中国abc" ; byte [] bytes = data.getBytes( "GBK" ); |
(2)使用”字符输出转换流”实现。
3.2、OutputStreamWriter字符输出转换流
(1)作用:可以控制写出去的字符使用什么字符集编码,
(2)解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。
3.2.1、案例
(1)study18-io-app2/src/com/itheima/d3_transform_stream/OutputStreamWriterTest3.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.itheima.d3_transform_stream; import java.io.*; /** * 目标:掌握字符输出转换流的使用 */ public class OutputStreamWriterTest3 { public static void main(String[] args) { // 指定写出去的字符编码 try ( // 放在小括号里面的原因是自动完成资源的释放 // 1、创建一个文件字节输出流 OutputStream os = new FileOutputStream( "study18-io-app2/src/itheima08out.txt" ); // 2、把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。 Writer osw = new OutputStreamWriter(os, "utf-8" ); // 3、把字符输出流包装成缓冲字符输出流 BufferedWriter bw = new BufferedWriter(osw) ) { bw.write( "我是这个人dada" ); bw.write( "我是发射点发生这个人sdfs" ); } catch (Exception e) { e.printStackTrace(); } } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步