您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關java壓縮文件的亂碼問題和解決方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。一、文件壓縮的中文亂碼問題
1、中文文件名的亂碼解決
對于壓縮的文件,當文件名稱是中文時,若使用JDK API中自帶的類(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)進行壓縮,壓縮完成后,可以看到壓縮包中的文件名稱是亂碼(文件的內容無亂碼問題)。
此時只要用ANT中的ant.jar中的類(org.apache.tools.zip.ZipEntry; org.apache.tools.zip.ZipOutputStream;)就可以解決此問題。
2、ant.jar依賴
<!-- ant.jar 用于解決文件解壓縮亂碼問題 --> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.6.5</version> </dependency>
二、JAVA實現ZIP壓縮源代碼
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * zip壓縮工具包 * @Class ZipUtils */ public class ZipUtils { private final static Logger logger = LoggerFactory.getLogger(ZipUtils.class); private static final int BUFFER_SIZE = 2 * 1024; /** * 壓縮成ZIP * @param srcFilePath 壓縮文件路徑 * @param tarFilePath 目標ZIP輸出路徑 * @param KeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構; * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結構可能會出現同名文件,會壓縮失敗) * @throws Exception 壓縮失敗會拋出異常 */ public static boolean toZip(String srcFilePath, String tarFilePath, boolean KeepDirStructure) throws Exception { boolean isCompressSuccess = false; long start = System.currentTimeMillis(); FileOutputStream fos = null; ZipOutputStream zos = null; try { File sourceFile = new File(srcFilePath); if (!sourceFile.exists()) { throw new FileNotFoundException("待壓縮文件 [" + srcFilePath + "]不存在."); } fos = new FileOutputStream(new File(tarFilePath)); zos = new ZipOutputStream(fos); // 設置壓縮的編碼,解決壓縮路徑中的中文亂碼問題 zos.setEncoding("UTF-8"); compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure); isCompressSuccess = true; long end = System.currentTimeMillis(); logger.info("【文件壓縮】 壓縮完成,耗時:{} ms", (end - start)); } catch (Exception e) { logger.error("【文件壓縮】 壓縮失敗", e); throw new RuntimeException("文件壓縮失敗", e); } finally { closeOutPutStream(zos); closeOutPutStream(fos); } return isCompressSuccess; } /** * 遞歸壓縮方法 * @param sourceFile 源文件 * @param zos zip輸出流 * @param name 壓縮后的名稱 * @param KeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構; * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結構可能會出現同名文件,會壓縮失敗) * @throws Exception */ private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception { byte[] buf = new byte[BUFFER_SIZE]; if (sourceFile.isFile()) { // 向zip輸出流中添加一個zip實體,構造器中name為zip實體的文件的名字 zos.putNextEntry(new ZipEntry(name)); // copy文件到zip輸出流中 int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1) { zos.write(buf, 0, len); } zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if (listFiles == null || listFiles.length == 0) { // 需要保留原來的文件結構時,需要對空文件夾進行處理 if (KeepDirStructure) { // 空文件夾的處理 zos.putNextEntry(new ZipEntry(name + "/")); // 沒有文件,不需要文件的copy zos.closeEntry(); } } else { for (File file : listFiles) { // 判斷是否需要保留原來的文件結構 if (KeepDirStructure) { // 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠, // 不然最后壓縮包中就不能保留原來的文件結構,即:所有文件都跑到壓縮包根目錄下了 compress(file, zos, name + "/" + file.getName(), KeepDirStructure); } else { compress(file, zos, file.getName(), KeepDirStructure); } } } } } /** * 釋放資源 * @Title closeOutPutStream * @param ops * @return void */ public static void closeOutPutStream(OutputStream ops) { if (ops != null) { try { ops.close(); } catch(IOException ex) { logger.error("關閉輸出流失敗", ex); } } } }
關于java壓縮文件的亂碼問題和解決方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。