EncoderConvert.java

  1. package edu.jiangxin.apktoolbox.file.core;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.OutputStreamWriter;
  9. import java.util.Collection;
  10. import java.util.Iterator;

  11. import org.apache.commons.io.FileUtils;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.apache.logging.log4j.LogManager;
  14. import org.apache.logging.log4j.Logger;

  15. /**
  16.  * 文件编码转换的工具类.
  17.  *
  18.  * @author jiangxin
  19.  * @author 2018-09-09
  20.  *
  21.  */
  22. public class EncoderConvert {

  23.     private static final String TMP_SUFFIX = ".temp";
  24.     private static final Logger logger = LogManager.getLogger(EncoderDetector.class.getSimpleName());

  25.     /**
  26.      * 实现对文件的编码转换.
  27.      *
  28.      * @param srcFileString 源文件文件名
  29.      * @param srcEncoder    源文件编码
  30.      * @param desFileString 目的文件文件名
  31.      * @param desEncoder    需要转换的编码
  32.      */
  33.     public static void encodeFile(String srcFileString, String srcEncoder, String desFileString, String desEncoder) {
  34.         if (srcFileString.equals(desFileString)) {
  35.             srcFileString = srcFileString + EncoderConvert.TMP_SUFFIX;
  36.             FileProcess.copyFile(desFileString, srcFileString);
  37.         }
  38.         File srcFileFile = new File(srcFileString);
  39.         File desFileFile = new File(desFileString);

  40.         File parentDir = desFileFile.getParentFile();
  41.         if (!parentDir.exists()) {
  42.             boolean success = parentDir.mkdirs();
  43.             if (!success) {
  44.                 logger.error("delete srcFileFile failed");
  45.                 return;
  46.             }
  47.         }

  48.         try (BufferedReader reader = new BufferedReader(
  49.                 new InputStreamReader(new FileInputStream(srcFileFile), srcEncoder));
  50.                 BufferedWriter writer = new BufferedWriter(
  51.                         new OutputStreamWriter(new FileOutputStream(desFileFile), desEncoder))) {
  52.             int ch = 0;
  53.             while ((ch = reader.read()) != -1) {
  54.                 writer.write(ch);
  55.             }
  56.         } catch (Exception e) {
  57.             logger.error("Exception", e);
  58.             return;
  59.         }

  60.         if (srcFileString.equals(desFileString + EncoderConvert.TMP_SUFFIX)) {
  61.             boolean success = srcFileFile.delete();
  62.             if (!success) {
  63.                 logger.error("delete srcFileFile failed");
  64.             }
  65.         }
  66.     }

  67.     /**
  68.      * 实现文件的编码转换. see {@link #encodeFile(String, String, String, String)}
  69.      *
  70.      * @param fileString 文件名
  71.      * @param srcEncoder 原始编码
  72.      * @param desEncoder 需要转换的编码
  73.      */
  74.     public static void encodeFile(String fileString, String srcEncoder, String desEncoder) {
  75.         encodeFile(fileString, srcEncoder, fileString, desEncoder);
  76.     }

  77.     /**
  78.      * 实现文件夹中特定文件的批量编码转换. see {@link #encodeFile(String, String, String, String)}
  79.      *
  80.      * @param srcDirString 原始文件夹
  81.      * @param srcEncoder   原始编码
  82.      * @param desDirString 目的文件夹
  83.      * @param desEncoder   需要转换的编码
  84.      * @param suffix       指定需要转换的后缀
  85.      */
  86.     public static void encodeDir(String srcDirString, String srcEncoder, String desDirString, String desEncoder,
  87.             String suffix) {
  88.         // File srcDirFile = new File(srcDirString);
  89.         File desDirFile = new File(desDirString);
  90.         // 获取所有符合条件的文件
  91.         String[] extensions = null;
  92.         if (StringUtils.isNotEmpty(suffix)) {
  93.             extensions = suffix.split(",");
  94.         }
  95.         Collection<File> files = FileUtils.listFiles(new File(srcDirString), extensions, true);
  96.         Iterator<File> it = files.iterator();
  97.         while (it.hasNext()) {
  98.             File tempFile = it.next();
  99.             String desFileString = desDirFile.getAbsolutePath() + File.separator + tempFile.getName();
  100.             String srcFileString = tempFile.getAbsolutePath();
  101.             encodeFile(srcFileString, srcEncoder, desFileString, desEncoder);
  102.         }
  103.     }

  104.     /**
  105.      * 实现文件夹中特定文件的批量编码转换. see {@link #encodeFile(String, String, String, String)}
  106.      *
  107.      * @param srcDirString 原始文件夹
  108.      * @param srcEncoder   原始编码
  109.      * @param desDirString 目的文件夹
  110.      * @param desEncoder   需要转换的编码
  111.      */
  112.     public static void encodeDir(String srcDirString, String srcEncoder, String desDirString, String desEncoder) {
  113.         encodeDir(srcDirString, srcEncoder, desDirString, desEncoder, null);
  114.     }
  115. }