用Java转换文件编码

Hello World, Hello Files

Posted by Resulte on March 8, 2020

用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为例,总结几个实现步骤:

  1. 创建InputStreamReader对象,构造方法中传递字节输入流对象和指定的编码表名称GBK
  2. 创建OutputStreamReader对象,构造方法中传递字节输出流对象和指定的编码表名称UTF-8
  3. 使用InputStreamReader对象中的方法read读取gbk_file.txt文件。
  4. 使用OutputStreamReader对象中的方法write,把读取的数据写入到文件utf_file中。
  5. 释放资源。

代码实现如下:

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