文章目录
- 转换流
- 字符输入转换流
- 字符输出转换流
转换流
之前我们代码编码和文件编码都是UTF-8, 所以没有出现中文乱码的问题
我们知道代码编码和文件编码的格式如果不一致的话会出现中文乱码的问题
那么如果在开发中, 我们确实会遇到编码不一致的情况如何解决呢?
我们可以使用字符输入转换流
可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
字符输入转换流
字符输入转换流: 实现类InputStreamReader, 可以把原始的字节流按照指定编码转换成字符输入流
字符输入转换流常用构造器如下(我们常用的是第二个构造器, 第一个构造器几乎不用):
构造器 | 说明 |
---|---|
InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认编码转换成字符输入流。(几乎不用,与默认的FileReader一样) |
InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点) |
例如我们文件编码是"GBK", 代码编码是UTF-8
public static void main(String[] args) throws Exception {
// 代码UTF-8 文件GBK
// 1. 提取GBK文件的原始字节流
InputStream is = new FileInputStream("/Users/chenyq/Documents/test2.txt");
// 2. 字符输入转换流: 把原始字节流转为字符输入流(以GBK编码的方式将文件转为字符输入流)
Reader isr = new InputStreamReader(is, "GBK");
// 3. 把转换的字符输入流再转换为缓冲输入流
BufferedReader br = new BufferedReader(isr);
// 读取文件内容
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
字符输出转换流
如果我们需要控制写出去的字符所使用的编码可以怎么做?
方式一: 可以把字符以指定编码获取字节后再使用字节输出流写出去(该方法在前面文章, 字符集编码解码讲过)
“我爱你中国”.getBytes(编码)
方式二: 可以使用字符输出转换流实现。
字符输出转换流:
字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。
字符输出转换流常用构造器如下(我们常用的是第二个构造器, 第一个构造器几乎不用):
构造器 | 说明 |
---|---|
OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。 |
OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照指定编码转换成字符输出流(重点) |
public static void main(String[] args) throws Exception {
// 1. 定义一个原始字节输出流
OutputStream os = new FileOutputStream("/Users/chenyq/Documents/test2.txt");
// 2. 字符转换输出流: 将原始的字节输出流转为字符输出流(指定GBK编码的方式写字符出去)
Writer osw = new OutputStreamWriter(os, "GBK");
// 3. 将转换的原始字符输出流载转换为缓冲字符输出流
Writer bw = new BufferedWriter(osw);
bw.write("我爱中国");
bw.write("我爱学习");
bw.write("我爱Java");
bw.close();
}