JAVA学习小记之IO流04--转换流篇
转换流:
按照A
规则存储,同样按照A
规则解析,那么就能显示正确的文本符号。反之,按照A
规则存储,再按照B
规则解析,就会导致乱码现象。
转换的原因是: 有的文件并非是按UTF-8编码,那么在读文件内容时可能就会乱码,此时需将字节流转为字符流(更好地读取中文),并选取恰当的编码方式,从而避免乱码~~~
字符集/编码表:
常见的比如: ASCII
字符集、GBK
字符集、Unicode
字符集(utf-8、utf-16...)
字节流->字符流InputStreamReader:
由于IDEA的设置,都是默认的UTF-8
编码。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。
构造方法:
InputStreamReader(InputStream in)
: 创建一个使用默认字符集的字符流。InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符流。
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
案例:
新建文本,名字为note,路径为D:\\code\\JavaDemo\\note.txt,内容为:
末日来临,后端居然成了最后的救世主...
全球丧尸爆发,唯一解药:后端开发学习经验!
没错,你没看错!
科学家们发现,丧尸病毒对计算机专业的人完全无效,尤其是那些学过后端开发的人,体内竟然自带抗体!
至此,我带着我的联想电脑和黑马教程杀出一条属于我们的血路!
package com.logindemo.IO;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
// 字节流->字符流
public class transform01 {
public static void main(String[] args) throws Exception {
String path="D:\\code\\JavaDemo\\note.txt";
//将FileInputStream转为InputStreamReader,实现将字节流转换为字符流
//因为其第一个参数要求是InputStream类及其子类,所以该位置参数只能是字节流
//设置编码方式
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path),"gbk"); // 第二个参数了决定的编码的类型,只有和文件存储时的类型一致,才能不乱码
//交给处理流去读取数据,效率更高
BufferedReader br = new BufferedReader(inputStreamReader);
String line; // 用于存储每行内容
// 循环读取每一行,直到返回null(文件结束)
while ((line = br.readLine()) != null) {
System.out.println(line);
}
// 关闭资源
br.close();
}
}
运行结果:
字符流->字节流OutputStreamWriter:
- 该类的构造器也可以指定编码类型,用于定义文件的编码方式
- 注意:若设置了gbk编码,但输入文件的内容中不含中文,则文件还是默认是utf-8的编码方式
构造方法:
OutputStreamWriter(OutputStream in)
: 创建一个使用默认字符集的字符流。OutputStreamWriter(OutputStream in, String charsetName)
: 创建一个指定字符集的字符流。
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("a.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("b.txt") , "GBK");
案例:
package com.logindemo.IO;
import java.io.*;
public class transform02 {
public static void main(String[] args) throws Exception {
//字符流->字节流 存储到文件中
String path="D:\\code\\JavaDemo\\note.txt";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path), "gbk");
osw.write("hello!你好island!!");
osw.close();
}
}
// 注意:若设置了gbk编码,但输入文件的内容中不含中文,则文件还是默认是utf-8的编码方式
运行结果: