用java转换文件的字符集
中文乱码真的是让人很头疼问题,有了这个方法应该能缓解这种头疼,用的是递归方式查找文件,直接在原文件中修改,小心使用(在本地测试效果有点诡异呀,没有达到预期效果)。
package com.hy.util; import info.monitorenter.cpdetector.io.*; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; public class CharacterChange{ public static void main(String[] args) throws FileNotFoundException, IOException { // 封装目录,需要修改文件格式的路径
File srcFolder = new File("F:\\test"); String newCharater = "GBK"; getAllJavaFilePaths(srcFolder, newCharater);
} private static void getAllJavaFilePaths(File srcFolder, String newCharater) throws IOException { // 获取该目录下所有的文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象
for (File file : fileArray) { // 继续判断是否以特定文件结尾,不是的话继续调用getAllJavaFilePaths()方法
if (file.isDirectory()) {
getAllJavaFilePaths(file, newCharater);
} else {
if (file.getName().endsWith(".sql")) {
try {
FileInputStream fis = new FileInputStream(file);
//oldcCharacter 获取特定的字符集
String oldcCharacter = getChartsetName(file);
InputStreamReader isr = new InputStreamReader(fis, oldcCharacter);
BufferedReader br = new BufferedReader(isr);
String str = null;
// 创建StringBuffer字符串缓存区
StringBuffer sb = new StringBuffer();
// 通过readLine()方法遍历读取文件
while ((str = br.readLine()) != null) {
// 使用readLine()方法无法进行换行,需要手动在原本输出的字符串后面加"\n"或"\r"
str += "\n";
sb.append(str);
}
String fileSource = sb.toString();
// 以GBK格式写入文件,file.getAbsolutePath()即该文件的绝对路径,false代表不追加直接覆盖,true代表追加文件
FileOutputStream fos = new FileOutputStream(file.getAbsolutePath(), false);
OutputStreamWriter osw = new OutputStreamWriter(fos, newCharater);
try {
osw.write(fileSource);
System.out.println(
"将:" + oldcCharacter + " 的文件:" + file.getAbsolutePath() + "修改字符集为:" + newCharater);
} finally {
osw.flush();
osw.close();
fos.close();
br.close();
isr.close();
fis.close();
}
} catch (Exception e) {
}
} else {
System.err.println("该文件以忽略:" + file.getAbsolutePath());
}
}
}
} public static String getChartsetName(File file) {
String chartsetName = null;
// 获取文件编码格式
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(new ParsingDetector(true));
detector.add(JChardetFacade.getInstance());
detector.add(ASCIIDetector.getInstance());
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
try {
if (file != null) {
charset = detector.detectCodepage(file.toURL());
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null) {
chartsetName = charset.name();
} else {
chartsetName = "未知的编码";
}
return chartsetName;
}
/*
* <dependency>
<groupId>net.sourceforge.jchardet</groupId>
<artifactId>jchardet</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
*/
}
用java转换文件的字符集的更多相关文章
- java实现文件转换成二进制存储与取出
一.功能描述: 将文件转成二进制数据放入数据库中,需要的时候,便可以取出安装与使用. 二.数据库: 建立一个数据库字段存放转成二进制的图片,这个字段有一个要求就是要设置成blob类型的 CREATE ...
- java实现 批量转换文件编码格式
一.场景说明 不知道大家有没有遇到过之前项目是GBK,现在需要全部换成UTF-8的情况.反正我是遇到了. eclipse可以改变项目的编码格式,但是文件如果直接转换的话里面的中文就会全部乱码,需要先复 ...
- java中调用kettle转换文件
java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...
- java读取文件批量插入记录
只是一个例子,方便以后查阅. import ey.db.oracle.OracleHelper; import ey.db.type.*; import java.io.BufferedReader; ...
- Java IO 文件与流基础
Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...
- oracle 如何查询/修改dmp文件的字符集
1.如何查询dmp文件的字符集 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集.如果dmp文件不大,比如只有几M或几十M,可以用Ul ...
- java 读写文件例子
在linux下可以读写中文 import java.io.*; import java.text.SimpleDateFormat; import java.util.*; public class ...
- java向文件中添加数据---手动版日志添加
核心代码为创建多级文件夹创建 //目标文件 File file=new File(filePath); //若不存在即创建文件 if(!file.exists()) { if (!file.getPa ...
- java写文件实现换行
Java 写文件实现换行 第一种: 写入的内容中利用\r\n进行换行 File file = new File("D:/text"); try { if(!file.exist ...
随机推荐
- Hadoop 3.2.1 win10 64位系统 vs2015 编译
Hadoop 3.2.1 win10 64位系统 vs2015 编译 1 环境配置 1.1 JDK下载安装 1.1.1 下载 JDK 1.8 (jdk1.8.0 ...
- 清空echarts的option
将相应的echarts的option治为空 $("#tt5sbmc").html("");
- 2018-2019-2 20165210《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165210<网络对抗技术>Exp9 Web安全基础 实验目的 本实践的目标理解常用网络攻击技术的基本原理. 实验内容 安装Webgoat SQL注入攻击 - ...
- 设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。
原创,转载请注明出处.https://www.cnblogs.com/yangf428/p/11254370.html 天勤例题[2-1]: 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺 ...
- PHP之Memcache和Memcached
本篇文章向大家介绍的是PHP中的Memcache和Memcached ,有兴趣的朋友可以看一下 **Memcache介绍:**Memcache是一套分布式缓存系统,分布式就是说可以在多台服务器上同时安 ...
- Quickstart: Create and publish a package using Visual Studio (.NET Framework, Windows)
https://docs.microsoft.com/en-us/nuget/quickstart/create-and-publish-a-package-using-visual-studio-n ...
- MongoDB(mongodb-win32-x86_64-enterprise-windows-64-4.2.1-signed.msi)下载,启动和插入数据,查询
下载链接:https://pan.baidu.com/s/19lM5Q-_BaDbjaO1Pj0SbYg&shfl=sharepset 安装一路Next就行,安装完毕后,进入目录C:\Prog ...
- 002-jdk-数据结构-工具类Collections、Arrays、System.arraycopy
常用备注 一.LIst to Array List<String> list = new ArrayList<String>(); Object[] array=list.to ...
- 反射之深入理解Constructor原理
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- AutoHome项目的学习
1.自定义UITabBar #import <UIKit/UIKit.h> @interface XHQTabBarViewController : UITabBarController ...