java使用zip壓縮中文文件名亂碼的解決辦法

java概述

創(chuàng)新互聯(lián)公司服務項目包括日喀則網(wǎng)站建設、日喀則網(wǎng)站制作、日喀則網(wǎng)頁制作以及日喀則網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,日喀則網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到日喀則省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

Java是一門面向對象編程語言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態(tài)面向對象編程語言的代表,極好地實現(xiàn)了面向對象理論,允許程序員以優(yōu)雅的思維方式進行復雜的編程。

Java具有簡單性、面向對象、分布式、健壯性、安全性、平臺獨立與可移植性、多線程、動態(tài)性等特點 。Java可以編寫桌面應用程序、Web應用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應用程序等。

java實現(xiàn)zip壓縮中文文件名亂碼的解決辦法:

一、文件壓縮的中文亂碼問題

1、中文文件名的亂碼解決

對于壓縮的文件,當文件名稱是中文時,若使用JDK API中自帶的類(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)進行壓縮,壓縮完成后,可以看到壓縮包中的文件名稱是亂碼(文件的內(nèi)容無亂碼問題)。此時只要用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實現(xiàn)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:所有文件跑到壓縮包根目錄下(注意:不保留目錄結構可能會出現(xiàn)同名文件,會壓縮失敗)
     * @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:所有文件跑到壓縮包根目錄下(注意:不保留目錄結構可能會出現(xiàn)同名文件,會壓縮失敗)
     * @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實現(xiàn)zip壓縮中文文件名亂碼怎么辦?的詳細內(nèi)容,更多請關注創(chuàng)新互聯(lián)其它相關文章!

當前名稱:java使用zip壓縮中文文件名亂碼的解決辦法
URL網(wǎng)址:http://muchs.cn/article6/ipjsog.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、微信小程序面包屑導航、企業(yè)建站關鍵詞優(yōu)化、網(wǎng)頁設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)