小工具:批量转换文件夹下的特定类…
2015-10-10 09:23
162 查看
网上没找到好的,于是自己用Java写了个小工具。
=======================代码的分割线=============================
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
public class BatchCharsetConvert {
static String
filePosfix;
static String
nowCharset;
static String
targetCharset;
static
ArrayList<String> succFiles = new
ArrayList<String>();
static
ArrayList<String> ignoreFiles = new
ArrayList<String>();
static
ArrayList<String> failedFiles = new
ArrayList<String>();
public static void
main(String[] args) {
if (args.length != 4) {
System.err
.println("Usage: java BatchCharsetConvert
[文件夹路径] [文件后缀] [当前编码] [目标编码]");
System.err
.println("Example: java BatchCharsetConvert
./project/src .java GBK UTF-8");
return;
}
String dirPath = args[0];
filePosfix = args[1];
nowCharset = args[2];
targetCharset = args[3];
// 检查Charset
try {
Charset.forName(nowCharset);
} catch (Exception ex) {
System.err.println("指定的当前编码不正确:" + nowCharset);
return;
}
try {
Charset.forName(targetCharset);
} catch (Exception ex) {
System.err.println("指定的目标编码不正确:" + targetCharset);
return;
}
// 遍历文件夹
File dir = new File(dirPath);
if (!dir.isDirectory()) {
System.err.println("指定的文件夹不正确:" + dirPath);
return;
}
visitAllDirsAndFiles(dir);
// 打印统计结果
for (String file : succFiles) {
System.out.println("转换成功:" + file);
}
System.out
.println("=======================================================");
for (String file : ignoreFiles) {
System.out.println("忽略:" + file);
}
System.out
.println("=======================================================");
for (String file : failedFiles) {
System.out.println("转换失败:" + file);
}
System.out.println("转换成功文件数:" +
succFiles.size());
System.out.println("转换失败文件数:" +
failedFiles.size());
System.out.println("忽略文件数:" +
ignoreFiles.size());
}
private static void
visitAllDirsAndFiles(File file) {
if (file.isDirectory()) {
String[]
children = file.list();
for (int i
= 0; i < children.length; i++) {
visitAllDirsAndFiles(new
File(file, children[i]));
}
} else if (file.isFile()) {
if
(!file.getName().endsWith(filePosfix)) {
ignoreFiles.add(file.getAbsolutePath());
return;
}
try
{
// 将文件内容读取到内存中
BufferedReader in = new
BufferedReader(new InputStreamReader(
new
FileInputStream(file), nowCharset));
StringBuilder sb = new
StringBuilder();
try {
String str;
while ((str = in.readLine()) != null) {
sb.append(str + "\r\n");
}
} finally {
if (in != null) {
try
{
in.close();
} catch
(Exception ex) {
// ignore
}
}
}
BufferedWriter out = new
BufferedWriter(new OutputStreamWriter(
new
FileOutputStream(file), targetCharset));
try {
out.write(sb.toString());
} finally {
if (out != null) {
try
{
out.close();
} catch
(Exception ex) {
// ignore
}
}
}
succFiles.add(file.getAbsolutePath());
} catch
(Exception ex) {
failedFiles.add(file.getAbsolutePath());
}
}
}
}
相关文章推荐
- IOS如何在容器类(如NSMutableSet)…
- 遇到技术问题的时候,建议使用如下…
- 关于代码注释的认识更新
- npm发布注意事项
- 高效地反向逐行读取文件
- Java和C/C++进行DES/AES密文传输
- 使用std::map和std::list实现LRU(…
- live555 ubuntu 12.04 下的编译安装测试
- 对软件架构的一些思考(V2.0)
- QT程序如何获知鼠标enter/leave通…
- 谈谈网络编程中应用层(基于TCP/UDP…
- iOS 9 下周就正式推出了,你的 app 真的适配好了吗?
- VC 获取当前目录
- POJ 2823 单调队列入门水题
- 关于微软公有云Azure会计标准
- char str[] 与 char *str的区别详细解析
- 基于Boost线程库实现Java中atomic…
- 两种定制行为的方式:使用参数和使…
- C++没有所谓的"赋值构造函数"
- C++中用字符串来切割字符串