Java 批量转换文本文件编码工具类
## 介绍
支持单个文件转换
支持按文件夹批量转换(支持子文件夹,输出文件夹与源文件夹目录层次相同)。
本文演示了按文件夹将文件批量从utf-8编码转换至GB2312编码。
## 代码
```java
package net.xsoftlab.baike;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
/**
* 批量转换文件编码
*
* @date 2014-10-23
*
* @author baike.xsoftlab.net
*/
public class BatchConvertFileEncode {
/**
* 获取文件或文件夹 不存在则创建
*
* @param path
* 文件或文件夹路径
* @return 已有/新创建的文件
* @throws IOException
* 可能产生的异常
*/
public static File getFile(String path) throws IOException {
File file = new File(path);
if (file.isDirectory()) {
if (!file.exists())
file.mkdirs();
} else {
// 判断目标文件所在的目录是否存在
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
if (!file.exists())
file.createNewFile();
}
return file;
}
/**
* 递归查找指定后缀名的文件
*
* @param folder
* 目标文件夹
* @param suffix
* 目标后缀名
* @return 找到的文件集合
*/
public static List<File> searchFile(File folder, final String suffix) {
List<File> result = new ArrayList<File>();
File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
@Override
public boolean accept(File pathname) {// 实现FileFilter类的accept方法
if (pathname.isDirectory()
&##124;&##124; (pathname.isFile() && pathname.getName().toLowerCase().endsWith(suffix.toLowerCase())))// 根据文件后缀名过滤
return true;
return false;
}
});
if (subFolders != null) {
for (File file : subFolders) {
if (file.isFile()) {
// 如果是文件则将文件添加到结果列表中
result.add(file);
} else {
// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
result.addAll(searchFile(file, suffix));
}
}
}
return result;
}
/**
* 单个文件转换编码
*
* @param file
* 要转换的文件
* @param tarFile
* 转换后的文件
* @param charset
* 转换前的编码
* @param tarCharset
* 转换后的编码
* @throws IOException
* 可能出现的异常
*/
public static void convertFileEncode(File file, File tarFile, String charset, String tarCharset)
throws IOException {
InputStreamReader reader = null;
OutputStreamWriter writer = null;
int length;
char[] b = new char[3 * 1024];
try {
// 打开文件输出流
reader = new InputStreamReader(new FileInputStream(file), charset);
writer = new OutputStreamWriter(new FileOutputStream(tarFile), tarCharset);
while ((length = reader.read(b)) != -1) {
writer.write(b, 0, length);
writer.flush();
}
} finally {
// 关闭文件流
if (reader != null)
reader.close();
if (writer != null)
writer.close();
}
}
/**
* 根据文件夹批量转换编码
*
* @param folder
* 要转换的文件夹
* @param tarFolder
* 输出文件夹
* @param charset
* 转换前的编码
* @param tarCharset
* 转换后的编码
* @param suffix
* 要转换的文件后缀名
* @throws IOException
* 可能出现的异常
*/
public static void convertFileEncodeByFolder(String folder, String tarFolder, String charset, String tarCharset,
String suffix) throws IOException {
String relTar = null;
List<File> result = searchFile(new File(folder), suffix);// 调用方法获得文件数组
System.out.println("找到 " + result.size() + " 个需要转换的文件");
// 文件尾部处理
if (!folder.endsWith("/") && !folder.endsWith("\\"))
folder += File.separator;
if (!tarFolder.endsWith("/") && !tarFolder.endsWith("\\"))
tarFolder += File.separator;
for (File file : result) {
// 使目标文件夹目录层次与源文件夹对应
relTar = tarFolder + file.getAbsolutePath().replace(folder.replace("/", "\\"), "");
convertFileEncode(file, getFile(relTar), charset, tarCharset);
}
System.out.println("转换成功!");
}
public static void main(String[] args) {
try {
convertFileEncodeByFolder("d:/11", "d:/22", "utf-8", "GB2312", ".txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```