溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java壓縮文件的亂碼問題和解決方法

發(fā)布時間:2020-06-19 09:53:13 來源:億速云 閱讀:398 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)java壓縮文件的亂碼問題和解決方法,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。一、文件壓縮的中文亂碼問題

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

對于壓縮的文件,當(dāng)文件名稱是中文時,若使用JDK API中自帶的類(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)進(jìn)行壓縮,壓縮完成后,可以看到壓縮包中的文件名稱是亂碼(文件的內(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實(shí)現(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 目標(biāo)ZIP輸出路徑
     * @param KeepDirStructure 是否保留原來的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu);
     *            false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會出現(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);
            // 設(shè)置壓縮的編碼,解決壓縮路徑中的中文亂碼問題
            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 是否保留原來的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu);
     *            false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會出現(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實(shí)體,構(gòu)造器中name為zip實(shí)體的文件的名字
            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) {
                // 需要保留原來的文件結(jié)構(gòu)時,需要對空文件夾進(jìn)行處理
                if (KeepDirStructure) {
                    // 空文件夾的處理
                    zos.putNextEntry(new ZipEntry(name + "/"));
                    // 沒有文件,不需要文件的copy
                    zos.closeEntry();
                }
            } else {
                for (File file : listFiles) {
                    // 判斷是否需要保留原來的文件結(jié)構(gòu)
                    if (KeepDirStructure) {
                        // 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,
                        // 不然最后壓縮包中就不能保留原來的文件結(jié)構(gòu),即:所有文件都跑到壓縮包根目錄下了
                        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("關(guān)閉輸出流失敗", ex);
            }
        }
    }

}

關(guān)于java壓縮文件的亂碼問題和解決方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI