java–转换文件编码
1.概念与问题
###1.1 字符编码
计算机中存储的信息都是用二进制数表示的,而我们在屏幕上看到的数字丶英文丶标点符号丶汉字等字符是二进制数转换之后的结果. 根据某种规则,将字符存储到计算机中,称为编码.反之,将存储在计算机中的二进制数按某种规则解析显示出来,称为解码. 例如,按照A规则存储,那么想要解析显示出正确的文本符号,同样需要按照A规则解析,否则将会导致乱码现象.
字符编码 (Character Encoding
) :一套自然语言的字符与二进制之间的对应规则.
###1.2 字符集
字符集是一个系统支持的所有字符的集合,包括各国的文字丶标点符号丶图形符号丶数字等
计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集至少有一套字符编码.常见的字符集有ASCII字符集丶GBK字符集丶Unicode字符集等.如图所示:
当指定了编码,它所对应的字符集也指定了. 想更详细了解各字符集丶编码信息,可在百度中搜索,这里不一一介绍.
###1.3 编码引出的问题
在IDEA中,使用FileReader
读取项目中的文本文件.由于IDEA的设置,都是默认的UTF-8编码,所以在读取时没有任何问题.但是,当读取Windows系统中创建的文本文件时,Windows系统中默认的是GBK编码,就会出现乱码的现象.如下所示:
public class Test {
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("C:\\Users\\86184\\Desktop\\a.txt");
int len;
while ((len = fr.read()) != -1){
System.out.print((char)len);
}
fr.close();
}
}
//实际文件内容: 你//
输出结果:
��
那么我们如何实现读取GBK编码的文件呢?
###1.4 转换流InputStreamReade
r类
InputStreamReader
类是Reader
的子类,是从字节到字符的桥梁.它读取字节,并使用指定的字符集将其解码为字符.它的字符可以有名称指定,也可以接受平台的默认字符集.
-
1.4.1构造方法
-InputStreamReader(InputStream in)
: 创建一个使用默认字符集的字符流.
-InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符流.构造举例,代码如下:
-InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"))
;
-InputStreamReader isr2 = new InputStreamReader(new FileInputStream("b.txt"),"GBK")
; -
1.4.2 指定编码读取文件:
public static void main(String[] args) throws Exception {
//定义文件路径,文件为GBK编码
String path = "C:\\Users\\86184\\Desktop\\a.txt"; //文件内容为:你好
//创建读入流对象,默认UTF-8编码
InputStreamReader isr = new InputStreamReader(
new FileInputStream(path));
//创建读入流对象,指定GBK编码
InputStreamReader isr2 = new InputStreamReader(
new FileInputStream(path),"gbk");
//定义变量,保存字符
int len ;
//使用默认编码读取
while((len = isr.read()) != -1){
System.out.print((char)len); //乱码:���
}
isr.close();
System.out.println();
//使用指定 字符编码读取
while((len = isr2.read()) != -1){
System.out.print((char)len);//你好
}
isr2.close();
}
###1.5 转换流OutputStreamWriter
类
OutputStreamWriter
类是Writer
的子类,是从字符流到字节流的桥梁.使用指定的字符集将字符编码为字节.它的字符集可以由名称指定,也可以接受平台默认的字符集.
-
1.5.1构造方法
OutputStreamWriter(OutputStream in)
:创建一个默认字符集的字符流.
OutputStreamWriter(OutputStream in,String charsetName)
:创建一个指定字符集的字符流.
构造举例:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"))
;
OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("b.txt"),"gbk")
; -
1.5.2指定编码文件
public static void main(String[] args) throws Exception {
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("a.txt"));
//创建输出流对象,指定GBK编码,定义路径
OutputStreamWriter osw2 = new OutputStreamWriter(
new FileOutputStream("b.txt"),"gbk");
//写出数据
osw.write("你好");//保存为6个字节(UTF8编码默认1个字符保存3字节)
osw.close();
//写出数据
osw2.write("你好");//保存为4字节(gbk默认2字节一个字符)
osw2.close();
}
| | |
|--|--|
| | |
###1.6 字节与字符转换图解
2.案例实现: 将GBK编码的文本文件,转换为UTF-8的文本文件
###2.1.思路分析:
- 指定GBK编码的转换流,读取文本文件
- 使用UTF-8编码的转换流,写出文本文件
###2.2代码实现:
public class Test2 {
public static void main(String[] args) throws Exception {
//定义文件路径,文件为GBK编码
String path = "C:\\Users\\86184\\Desktop\\a.txt"; //文件内容为:你好
//创建读入流对象,指定GBK编码
InputStreamReader isr2 = new InputStreamReader(
new FileInputStream(path),"gbk");
//定义变量,保存字符
int len ;
//创建输出流对象,默认UTF-8编码,定义路径
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("a.txt"));
//使用指定 字符编码读取
while((len = isr2.read()) != -1){ //循环读取
osw.write(len);
}
//关流
osw.close();
isr2.close();
}
}