随笔 - 876,  文章 - 0,  评论 - 0,  阅读 - 1108

一、转换流

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();
        }
    }
}

  

posted on   小青年&乖乖  阅读(4)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示