`
peachtao
  • 浏览: 38905 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类

项目文件转码

阅读更多
package com.peachtao.file.op;
import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;

import java.io.BufferedReader;
import java.io.BufferedWriter;
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;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

import org.apache.commons.io.FileUtils;

//此文件负责项目文件转码,项目文件需要使用到common-io.jar 因为涉及到文件操作的辅助类,需要使用到cpdetector_1.0.7.jar,chardet.jar,antlr.jar用作编码检测
public class CharEncodingExchange {

private final static String SOURCE_ENCODING = "GB2312";
private final static String TARGET_ENCODING = "UTF-8";
// 文件源目录
private static String SOURCE_DIR = "D:\\xampp\\htdocs\\uchome";
// 文件目标目录
private static String TARGET_DIR = "d:\\tem";
// 允许转码的文件后缀
private static String suffAllow = "html,htm,txt,js,php,sql,inc,tpl,css,java,jsp,xml,tld,properties";
private static String suffForbiden = "db";

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
FileUtils.deleteDirectory(new File(TARGET_DIR));
exchange(SOURCE_DIR);
} catch (Exception e) {
// TODO Auto-generated catch blockXj
e.printStackTrace();
}
System.out.println("----------end --------------");
}

/**
* exchange the character encoding from srcDir to targetDir
*
* @param srcDir
* @param targetDir
*/
public static void exchange(String srcDir) {
String absPath = "";
if (!srcDir.equals(SOURCE_DIR)) {
absPath = srcDir.substring(SOURCE_DIR.length());
String targetDir = TARGET_DIR + absPath;
File targetDirectory = new File(targetDir);
if (targetDirectory.isDirectory() && !targetDirectory.exists()) {
targetDirectory.mkdirs();
}
}

File sourceDirectory = new File(srcDir);
if (sourceDirectory.exists()) {
if (sourceDirectory.isFile()) {
String targetFilePath = TARGET_DIR + absPath;
// System.out.println(sourceDirectory.getAbsolutePath() + " "
// + targetFilePath);
String suff = absPath.substring(absPath.lastIndexOf(".") + 1);
System.out.println(sourceDirectory.getAbsolutePath()+"\t"+getFileCharacterEnding(sourceDirectory));
try {
if (!suffForbiden.equals(suff)) {
if (suffixAllow(suff)&&!"UTF-8".equals(getFileCharacterEnding(sourceDirectory))) {
fileEncodingExchange(sourceDirectory,
targetFilePath);
} else {
fileCopy(sourceDirectory, targetFilePath);
// System.out.println(sourceDirectory);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
File[] childs = sourceDirectory.listFiles();

for (File child : childs)
exchange(child.getPath());
}
}
}

private static void fileEncodingExchange(File infile,
String targetAbsFilePath) throws IOException {
FileInputStream fin = null;
FileOutputStream fout = null;
FileChannel fcin = null;
FileChannel fcout = null;

String tmpTargetPath = targetAbsFilePath.substring(0, targetAbsFilePath
.lastIndexOf(File.separator));
File tmpTargetDir = new File(tmpTargetPath);
if (!tmpTargetDir.exists())
tmpTargetDir.mkdirs();
try {
fin = new FileInputStream(infile);
fout = new FileOutputStream(targetAbsFilePath);
fcin = fin.getChannel();
fcout = fout.getChannel();

ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
buffer.clear();
int r = fcin.read(buffer);
if (r == -1) {
break;
}
buffer.flip();
String encoding = System.getProperty("file.encoding");
//检测原理,将文件按encoding解码后在编码成TARGET_ENCODING
fcout.write(ByteBuffer.wrap(Charset.forName(encoding).decode(
buffer).toString().getBytes(TARGET_ENCODING)));
// fcout.write(buffer);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fin != null) {
fin.close();
}
if (fcin != null) {
fcin.close();
}
if (fout != null)
fout.close();
if (fcout != null)
fcout.close();
}
}

private static void fileCopy(File infile, String targetAbsFilePath) {
try {
FileUtils.copyFile(infile, new File(targetAbsFilePath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private static void fileEncodingExchange0(File infile,
String targetAbsFilePath) throws IOException {
FileInputStream fis = new FileInputStream(infile);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));

File targetFile = new File(targetAbsFilePath);
if (!targetFile.exists()) {
targetFile.mkdir();
}
FileOutputStream fos = new FileOutputStream(targetFile);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos,
TARGET_ENCODING));

int len = 1024;
char[] buf = new char[len];

int numRead;
while ((numRead = in.read(buf, 0, len)) != -1) {
out.write(buf, 0, numRead);
}
out.close();
in.close();
// System.out.println(infile+"\t"+targetAbsFilePath);
}

private static boolean suffixAllow(String suff) {
boolean flag = false;
String[] suffs = suffAllow.trim().split(",");
for (String a : suffs) {
if (suff.endsWith(a)) {
flag = true;
break;
}
}
return flag;
}

public static String getFileCharacterEnding(File file) {

String fileCharacterEnding = "UTF-8";

CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(JChardetFacade.getInstance());

Charset charset = null;

// File f = new File(filePath);

try {
charset = detector.detectCodepage(file.toURL());
} catch (Exception e) {
e.printStackTrace();
}
if (charset != null) {
fileCharacterEnding = charset.name();
}

return fileCharacterEnding;
}
}
分享到:
评论

相关推荐

    项目文件转码java源码

    实际项目中有很多文件的编码是非utf编码,当多种编码的文件相互包含时,会...可将项目文件由非utf-8编码的文件 转换成utf8编码,避免项目中的文件部分是utf8编码,另外一部分是非utf8编码。可快速批量的见文件转码。

    myEclipse或Eclipse批量文件转码插件

    比如图2的转码规则就是对项目的jsp文件,不管原来是什么编码,统一转为UTF-8编码,并且同时转换文件内容。可以点击右边的Add /Remove按钮来增加/删除规则。最后点击Apply来保存设置。 step3. 转码 在设置了转码规...

    MFC界面实现文件转码

    在MFC中实现文件转码,首先需要读取源文件,然后根据源文件的原始编码进行解码,再按照目标编码进行编码,最后将结果写入新文件。在这个过程中,`CFile`类是用于文件操作的基础,而`CString`类则用于处理字符串。 ...

    获取文件编码格式与文件转码

    在"FileCharSetDemo-master"这个项目中,我们可以找到相关的示例代码,它可能包含了一些实用的方法来演示如何在Android环境中获取文件编码和执行文件转码。这些方法可能包括对文件的读取、字节转换、编码检测和转码...

    强大的音视频文件转码SDK

    【音视频文件转码SDK详解】 音视频转码是数字媒体处理中的关键技术,它涉及到将原始的音视频数据转换成不同编码格式,以适应不同的播放设备、网络环境或存储需求。这里提到的“强大的音视频文件转码SDK”,显然是一...

    C#获取视频文件信息及视频转码操作

    在C#编程环境中,处理视频文件,包括获取视频文件信息和进行视频转码,是多媒体应用开发中的常见任务。本文将详细介绍如何利用C#来实现这些功能。 首先,要获取视频文件信息,我们需要借助第三方库或者.NET ...

    项目转码工具

    此时,“项目转码工具”就显得尤为必要,它能够批量地、高效地将这些文件转换为UTF-8编码,从而确保代码的可读性和兼容性。 这个工具可能包含以下几个核心功能: 1. **文件检测**:首先,工具需要能够检测项目中...

    视频文件的转码

    总之,Java在视频文件转码中的应用涉及到多媒体处理、编码解码、文件操作等多个技术领域,开发者需要熟悉相关的库和工具,并具备一定的系统设计和优化能力。通过结合定时任务和适当的处理策略,可以高效地处理大量的...

    文件转码UTF8工具

    在本项目中,"文件转码UTF8工具"是一个用C#编写的Windows桌面应用程序(WinForm),其核心功能是帮助用户批量将指定文件夹中的文件转码为UTF-8格式。这个工具不仅方便了开发者和普通用户对文本文件的管理,还提供了...

    音频文件转码java开发,基于jave开源框架

    在Java开发中,音频文件转码是一项常见的任务,特别是在多媒体应用、音频处理或者网络音频传输等领域。本项目基于Jave开源框架,它提供了一个高效且易于使用的API来处理音频编码和解码工作。Jave(Java Audio Video ...

    eclipse文件转码插件 lifesting

    此时,"eclipse文件转码插件 lifesting"就显得尤为重要。 该插件,全称为"com.lifesting.tool.encoding",是专为Eclipse和Myeclipse设计的,旨在帮助用户快速、批量地转换项目中的文件编码格式。Myeclipse是Eclipse...

    c#视频转码工具源码

    本项目“C#视频转码工具源码”便是这样一款应用,它利用了开源的FFmpeg库,提供了多路转码支持,并且具有用户友好的界面和进度条显示。 FFmpeg是一款强大的跨平台多媒体处理工具,集成了视频、音频的编码、解码、...

    C#开发的在线或本地视频转码成ts或其他文件代码

    本项目是关于使用C#进行在线或本地视频转码为TS(Transport Stream)或者其他格式的文件。下面我们将深入探讨这个主题。 首先,C#结合FFmpeg,一个开源的跨平台多媒体处理框架,可以实现视频转码。FFmpeg支持多种...

    基于Python实现QQ音乐音频批量转码(可执行文件)

    在这个项目中,使用了Python编程语言,以及一些外部工具,如ffmpeg和um.exe,进行多步骤的文件转码。 【描述】"先mgg转ogg 再ogg转mp3 将可执行文件解压到QQ音乐下载目录中"揭示了转码过程的顺序。首先,需要将QQ...

    音频转码,pcm 转 wav 格式

    在IT行业中,音频处理是一项重要的任务,特别是在多媒体应用和网络服务中。本篇文章将深入探讨...使用提供的“PcmToWav-master”资源,开发者可以进一步研究和定制自己的音频转码解决方案,以适应特定的项目需求。

    unicode转码工具,小巧好用

    Unicode是一种国际标准的字符编码方案,它旨在包含世界上所有语言的字符,确保数据在不同系统间无缝传输。...在处理涉及跨文化沟通的项目时,掌握Unicode和相关转码工具的使用技巧,可以避免许多潜在的通信障碍。

    源码批量转码工具

    源码批量转码工具是一款专为编程人员设计的实用型软件,主要针对源代码文件进行批量的字符编码转换。在编程工作中,不同的项目可能采用不同的字符编码格式,如ASCII、UTF-8、GBK等,这可能导致在不同环境或平台间...

    Flutter 音频转码Mp3文件插件

    本篇文章将深入探讨如何在Flutter项目中使用音频转码插件,特别是针对将wav、aac、pcm等格式的音频文件转码为mp3文件的流程。 首先,我们关注的"Flutter音频转码Mp3文件插件"是专门为Flutter应用设计的一个组件,它...

    51模板转码

    总结起来,51模板转码是一个面向51系统或相关项目的编码转换工具,它提供了一种便捷的方式将文本文件从一种编码格式转换为另一种,确保在不同的系统和环境中能正确读取和显示文本。通过使用配套的用户手册和配置文件...

    iconv 自动转码批处理工具

    在描述中,“写成bat,方便使用”表明这个批处理文件(iconv.bat)是为了简化用户操作而创建的,用户只需要提供源文件和目标编码,就能批量对文件进行转码。这对于处理大量文件或目录结构复杂的项目尤其有用。 标签...

Global site tag (gtag.js) - Google Analytics