package cn.keking.utils; import cn.keking.config.ConfigConstants; import cn.keking.service.ZtreeNodeVo; import java.io.File; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author : Gao * create : 2023-04-08 **/ public class RarUtils { private static final String fileDir = ConfigConstants.getFileDir(); public static byte[] getUTF8BytesFromGBKString(String gbkStr) { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; int k = 0; for (int i = 0; i < n; i++) { int m = gbkStr.charAt(i); if (m < 128 && m >= 0) { utfBytes[k++] = (byte) m; continue; } utfBytes[k++] = (byte) (0xe0 | (m >> 12)); utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f)); utfBytes[k++] = (byte) (0x80 | (m & 0x3f)); } if (k < utfBytes.length) { byte[] tmp = new byte[k]; System.arraycopy(utfBytes, 0, tmp, 0, k); return tmp; } return utfBytes; } public static String getUtf8String(String str) { if (str != null && str.length() > 0) { String needEncodeCode = "ISO-8859-1"; String neeEncodeCode = "ISO-8859-2"; String gbkEncodeCode = "GBK"; try { if (Charset.forName(needEncodeCode).newEncoder().canEncode(str)) { str = new String(str.getBytes(needEncodeCode), StandardCharsets.UTF_8); } if (Charset.forName(neeEncodeCode).newEncoder().canEncode(str)) { str = new String(str.getBytes(neeEncodeCode), StandardCharsets.UTF_8); } if (Charset.forName(gbkEncodeCode).newEncoder().canEncode(str)) { str = new String(getUTF8BytesFromGBKString(str), StandardCharsets.UTF_8); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return str; } /** * 判断是否是中日韩文字 */ private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS; } public static boolean judge(char c){ return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'); } public static String specialSymbols(String str) { //去除压缩包文件字符串中特殊符号 Pattern p = Pattern.compile("\\s|\t|\r|\n|\\+|#|&|=|�|\\p{P}"); // Pattern p = Pattern.compile("\\s|\\+|#|&|=|\\p{P}"); Matcher m = p.matcher(str); return m.replaceAll(""); } public static boolean isMessyCode(String strName) { //去除字符串中的空格 制表符 换行 回车 strName = specialSymbols(strName); //处理之后转换成字符数组 char[] ch = strName.trim().toCharArray(); for (char c : ch) { //判断是否是数字或者英文字符 if (!judge(c)) { //判断是否是中日韩文 if (!isChinese(c)) { //如果不是数字或者英文字符也不是中日韩文则表示是乱码返回true return true; } } } //表示不是乱码 返回false return false; } /** * 读取文件目录树 */ public static List getTree(String rootPath) { List nodes = new ArrayList<>(); File file = new File(fileDir+rootPath); ZtreeNodeVo node = traverse(file); nodes.add(node); return nodes; } private static ZtreeNodeVo traverse(File file) { ZtreeNodeVo pathNodeVo = new ZtreeNodeVo(); pathNodeVo.setId(file.getAbsolutePath().replace(fileDir, "").replace("\\", "/")); pathNodeVo.setName(file.getName()); pathNodeVo.setPid(file.getParent().replace(fileDir, "").replace("\\", "/")); if (file.isDirectory()) { List subNodeVos = new ArrayList<>(); File[] subFiles = file.listFiles(); if (subFiles == null) { return pathNodeVo; } for (File subFile : subFiles) { ZtreeNodeVo subNodeVo = traverse(subFile); subNodeVos.add(subNodeVo); } pathNodeVo.setChildren(subNodeVos); } return pathNodeVo; } }