使用java进行文件编码转换

折月煮酒 提交于 2020-02-17 01:09:31

在开发过程中,可能会遇到文件编码的转换,虽然说开发工具eclipse可以转换编码,但是有的情况却很不方便。比如,原来文件本身的编码是GBK,现在要转换成UTF-8,如果直接在eclipse中把文件编码修改成UTF-8,恭喜你,是乱码,因为不能直接从GBK到UTF-8进行转换,这时就需要我们手动的来转换编码。下面是一个文件编码转换的工具类。

package com.mikan.stuff;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
 
public class FileCharsetConverter {
 
    public static void main(String[] args) throws Exception {
        convert("D:\\stuff\\src\\main\\java\\com\\mikan\\stuff\\test.txt",
                "GBK", "UTF-8", new FilenameFilter() {
                    @Override
                    public boolean accept(File dir, String name) {
                        return name.endsWith("txt");
                    }
                });
    }
 
    /**
     * 把指定文件或目录转换成指定的编码
     * 
     * @param fileName
     *            要转换的文件
     * @param fromCharsetName
     *            源文件的编码
     * @param toCharsetName
     *            要转换的编码
     * @throws Exception
     */
    public static void convert(String fileName, String fromCharsetName,
            String toCharsetName) throws Exception {
        convert(new File(fileName), fromCharsetName, toCharsetName, null);
    }
 
    /**
     * 把指定文件或目录转换成指定的编码
     * 
     * @param file
     *            要转换的文件或目录
     * @param fromCharsetName
     *            源文件的编码
     * @param toCharsetName
     *            要转换的编码
     * @throws Exception
     */
    public static void convert(File file, String fromCharsetName,
            String toCharsetName) throws Exception {
        convert(file, fromCharsetName, toCharsetName, null);
    }
 
    /**
     * 把指定文件或目录转换成指定的编码
     * 
     * @param file
     *            要转换的文件或目录
     * @param fromCharsetName
     *            源文件的编码
     * @param toCharsetName
     *            要转换的编码
     * @param filter
     *            文件名过滤器
     * @throws Exception
     */
    public static void convert(String fileName, String fromCharsetName,
            String toCharsetName, FilenameFilter filter) throws Exception {
        convert(new File(fileName), fromCharsetName, toCharsetName, filter);
    }
 
    /**
     * 把指定文件或目录转换成指定的编码
     * 
     * @param file
     *            要转换的文件或目录
     * @param fromCharsetName
     *            源文件的编码
     * @param toCharsetName
     *            要转换的编码
     * @param filter
     *            文件名过滤器
     * @throws Exception
     */
    public static void convert(File file, String fromCharsetName,
            String toCharsetName, FilenameFilter filter) throws Exception {
        if (file.isDirectory()) {
            File[] fileList = null;
            if (filter == null) {
                fileList = file.listFiles();
            } else {
                fileList = file.listFiles(filter);
            }
            for (File f : fileList) {
                convert(f, fromCharsetName, toCharsetName, filter);
            }
        } else {
            if (filter == null
                    || filter.accept(file.getParentFile(), file.getName())) {
                String fileContent = getFileContentFromCharset(file,
                        fromCharsetName);
                saveFile2Charset(file, toCharsetName, fileContent);
            }
        }
    }
 
    /**
     * 以指定编码方式读取文件,返回文件内容
     *
     * @param file
     *            要转换的文件
     * @param fromCharsetName
     *            源文件的编码
     * @return
     * @throws Exception
     */
    public static String getFileContentFromCharset(File file,
            String fromCharsetName) throws Exception {
        if (!Charset.isSupported(fromCharsetName)) {
            throw new UnsupportedCharsetException(fromCharsetName);
        }
        InputStream inputStream = new FileInputStream(file);
        InputStreamReader reader = new InputStreamReader(inputStream,
                fromCharsetName);
        char[] chs = new char[(int) file.length()];
        reader.read(chs);
        String str = new String(chs).trim();
        reader.close();
        return str;
    }
 
    /**
     * 以指定编码方式写文本文件,存在会覆盖
     * 
     * @param file
     *            要写入的文件
     * @param toCharsetName
     *            要转换的编码
     * @param content
     *            文件内容
     * @throws Exception
     */
    public static void saveFile2Charset(File file, String toCharsetName,
            String content) throws Exception {
        if (!Charset.isSupported(toCharsetName)) {
            throw new UnsupportedCharsetException(toCharsetName);
        }
        OutputStream outputStream = new FileOutputStream(file);
        OutputStreamWriter outWrite = new OutputStreamWriter(outputStream,
                toCharsetName);
        outWrite.write(content);
        outWrite.close();
    }
}

————————————————
from:https://blog.csdn.net/mhmyqn/article/details/37917947

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!