用Java转换文件编码
常见的文件编码格式有许多种,例如ASCII
编码主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号),GBK
是最常用的中文码表,以及最为常用的UTF-8
编码。
但是,在含有中文字符的文件中,常常会因为文件编码格式的不同产生乱码。因为在GBK
中一个中文字符是两个字节编码的,而UTF-8
中一个中文字符是三个字节编码的。
所以,文件编码格式转换就成了必不可缺的一个操作。
在Java中,我们可以很轻松的通过转换流实现文件编码格式的转换:
- 转换输出流
OutputStreamWriter(OutputStream in, String charsetName)
: 创建一个指定字符集的字符流。 - 装换输入流
InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符流。
下面,我将以需要把C盘下的用GBK
编码的gbk_file.txt
文件,转换为用UTF-8
编码的utf_file
为例,总结几个实现步骤:
- 创建
InputStreamReader
对象,构造方法中传递字节输入流对象和指定的编码表名称GBK
。 - 创建
OutputStreamReader
对象,构造方法中传递字节输出流对象和指定的编码表名称UTF-8
。 - 使用
InputStreamReader
对象中的方法read
读取gbk_file.txt
文件。 - 使用
OutputStreamReader
对象中的方法write
,把读取的数据写入到文件utf_file
中。 - 释放资源。
代码实现如下:
public class FileTest {
public static void main(String[] args) throws IOException {
//1.创建一个转换输入流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("C\\gbk_file.txt"), "GBK");
//2.创建一个转换输出流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\utf_file.txt"), "UTF-8");
//data存储字节数据
byte data = 0;
//循环读入字节数据并输出到目标文件中
while((data = isr.read()) != -1){
osw.write(data);
}
//释放资源
osw.close();
isr.close();
}
}
当然,我依旧可以通过增加一个字符缓冲数组的方式,加快转换效率:
public class FileTest {
public static void main(String[] args) throws IOException {
//1.创建一个转换输入流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("C\\gbk_file.txt"), "GBK");
//2.创建一个转换输出流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\utf_file.txt"), "UTF-8");
//字符缓存数组,一次读取1024字节的数据
char[] c = new char[1024];
//每次读取数据的有效长度
int len = 0;
while((len = isr.read(c)) != -1){
osw.write(c, 0, len);
}
//释放资源
osw.close();
isr.close();
}
}