javazip壓縮,javazip壓縮加密

本文目錄一覽:

怎樣用java快速實現zip文件的壓縮解壓縮

package zip;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.Enumeration;

import java.util.zip.CRC32;

import java.util.zip.CheckedOutputStream;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import java.util.zip.ZipOutputStream;

import org.apache.commons.lang3.StringUtils;

public class ZipUtil {

/**

 * 遞歸壓縮文件夾

 * @param srcRootDir 壓縮文件夾根目錄的子路徑

 * @param file 當前遞歸壓縮的文件或目錄對象

 * @param zos 壓縮文件存儲對象

 * @throws Exception

 */

private static void zip(String srcRootDir, File file, ZipOutputStream zos) throws Exception

{

if (file == null) 

{

return;

}

//如果是文件,則直接壓縮該文件

if (file.isFile())

{

int count, bufferLen = 1024;

byte data[] = new byte[bufferLen];

//獲取文件相對於壓縮文件夾根目錄的子路徑

String subPath = file.getAbsolutePath();

int index = subPath.indexOf(srcRootDir);

if (index != -1) 

{

subPath = subPath.substring(srcRootDir.length() + File.separator.length());

}

ZipEntry entry = new ZipEntry(subPath);

zos.putNextEntry(entry);

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

while ((count = bis.read(data, 0, bufferLen)) != -1) 

{

zos.write(data, 0, count);

}

bis.close();

zos.closeEntry();

}

//如果是目錄,則壓縮整個目錄

else 

{

//壓縮目錄中的文件或子目錄

File[] childFileList = file.listFiles();

for (int n=0; nchildFileList.length; n++)

{

childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath());

zip(srcRootDir, childFileList[n], zos);

}

}

}

/**

 * 對文件或文件目錄進行壓縮

 * @param srcPath 要壓縮的源文件路徑。如果壓縮一個文件,則為該文件的全路徑;如果壓縮一個目錄,則為該目錄的頂層目錄路徑

 * @param zipPath 壓縮文件保存的路徑。注意:zipPath不能是srcPath路徑下的子文件夾

 * @param zipFileName 壓縮文件名

 * @throws Exception

 */

public static void zip(String srcPath, String zipPath, String zipFileName) throws Exception

{

if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(zipPath) || StringUtils.isEmpty(zipFileName))

{

throw new ParameterException(ICommonResultCode.PARAMETER_IS_NULL);

}

CheckedOutputStream cos = null;

ZipOutputStream zos = null;

try

{

File srcFile = new File(srcPath);

//判斷壓縮文件保存的路徑是否為源文件路徑的子文件夾,如果是,則拋出異常(防止無限遞歸壓縮的發生)

if (srcFile.isDirectory()  zipPath.indexOf(srcPath)!=-1) 

{

throw new ParameterException(ICommonResultCode.INVALID_PARAMETER, “zipPath must not be the child directory of srcPath.”);

}

//判斷壓縮文件保存的路徑是否存在,如果不存在,則創建目錄

File zipDir = new File(zipPath);

if (!zipDir.exists() || !zipDir.isDirectory())

{

zipDir.mkdirs();

}

//創建壓縮文件保存的文件對象

String zipFilePath = zipPath + File.separator + zipFileName;

File zipFile = new File(zipFilePath);

if (zipFile.exists())

{

//檢測文件是否允許刪除,如果不允許刪除,將會拋出SecurityException

SecurityManager securityManager = new SecurityManager();

securityManager.checkDelete(zipFilePath);

//刪除已存在的目標文件

zipFile.delete();

}

cos = new CheckedOutputStream(new FileOutputStream(zipFile), new CRC32());

zos = new ZipOutputStream(cos);

//如果只是壓縮一個文件,則需要截取該文件的父目錄

String srcRootDir = srcPath;

if (srcFile.isFile())

{

int index = srcPath.lastIndexOf(File.separator);

if (index != -1)

{

srcRootDir = srcPath.substring(0, index);

}

}

//調用遞歸壓縮方法進行目錄或文件壓縮

zip(srcRootDir, srcFile, zos);

zos.flush();

}

catch (Exception e) 

{

throw e;

}

finally 

{

try

{

if (zos != null)

{

zos.close();

}

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

/**

 * 解壓縮zip包

 * @param zipFilePath zip文件的全路徑

 * @param unzipFilePath 解壓後的文件保存的路徑

 * @param includeZipFileName 解壓後的文件保存的路徑是否包含壓縮文件的文件名。true-包含;false-不包含

 */

@SuppressWarnings(“unchecked”)

public static void unzip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception

{

if (StringUtils.isEmpty(zipFilePath) || StringUtils.isEmpty(unzipFilePath))

{

throw new ParameterException(ICommonResultCode.PARAMETER_IS_NULL);

}

File zipFile = new File(zipFilePath);

//如果解壓後的文件保存路徑包含壓縮文件的文件名,則追加該文件名到解壓路徑

if (includeZipFileName)

{

String fileName = zipFile.getName();

if (StringUtils.isNotEmpty(fileName))

{

fileName = fileName.substring(0, fileName.lastIndexOf(“.”));

}

unzipFilePath = unzipFilePath + File.separator + fileName;

}

//創建解壓縮文件保存的路徑

File unzipFileDir = new File(unzipFilePath);

if (!unzipFileDir.exists() || !unzipFileDir.isDirectory())

{

unzipFileDir.mkdirs();

}

//開始解壓

ZipEntry entry = null;

String entryFilePath = null, entryDirPath = null;

File entryFile = null, entryDir = null;

int index = 0, count = 0, bufferSize = 1024;

byte[] buffer = new byte[bufferSize];

BufferedInputStream bis = null;

BufferedOutputStream bos = null;

ZipFile zip = new ZipFile(zipFile);

EnumerationZipEntry entries = (EnumerationZipEntry)zip.entries();

//循環對壓縮包里的每一個文件進行解壓

while(entries.hasMoreElements())

{

entry = entries.nextElement();

//構建壓縮包中一個文件解壓後保存的文件全路徑

entryFilePath = unzipFilePath + File.separator + entry.getName();

//構建解壓後保存的文件夾路徑

index = entryFilePath.lastIndexOf(File.separator);

if (index != -1)

{

entryDirPath = entryFilePath.substring(0, index);

}

else

{

entryDirPath = “”;

}

entryDir = new File(entryDirPath);

//如果文件夾路徑不存在,則創建文件夾

if (!entryDir.exists() || !entryDir.isDirectory())

{

entryDir.mkdirs();

}

//創建解壓文件

entryFile = new File(entryFilePath);

if (entryFile.exists())

{

//檢測文件是否允許刪除,如果不允許刪除,將會拋出SecurityException

SecurityManager securityManager = new SecurityManager();

securityManager.checkDelete(entryFilePath);

//刪除已存在的目標文件

entryFile.delete();

}

//寫入文件

bos = new BufferedOutputStream(new FileOutputStream(entryFile));

bis = new BufferedInputStream(zip.getInputStream(entry));

while ((count = bis.read(buffer, 0, bufferSize)) != -1)

{

bos.write(buffer, 0, count);

}

bos.flush();

bos.close();

}

}

public static void main(String[] args) 

{

String zipPath = “d:\\ziptest\\zipPath”;

String dir = “d:\\ziptest\\rawfiles”;

String zipFileName = “test.zip”;

try

{

zip(dir, zipPath, zipFileName);

catch (Exception e)

{

e.printStackTrace();

}

String zipFilePath = “D:\\ziptest\\zipPath\\test.zip”;

String unzipFilePath = “D:\\ziptest\\zipPath”;

try 

{

unzip(zipFilePath, unzipFilePath, true);

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

如何在java中執行zip壓縮命令

public class ZipFile {

    public static void main(String[] args) throws Exception {

        //zip -r qq.zip WEB-INF -x ‘*.DS_Store’

        

        ZipFile zipFile = new ZipFile();

        zipFile.start(“zip -r qq.zip WEB-INF -x ‘*.DS_Store'”);

    }

    private synchronized void start(String cmd) throws Exception {

        Process pro = null;

        pro = Runtime.getRuntime().exec(cmd);

        new DoOutput(pro.getInputStream()).start();

        new DoOutput(pro.getErrorStream()).start();

    }

    private class DoOutput extends Thread {

        public InputStream is;

        public DoOutput(InputStream is) {

            this.is = is;

        }

        public void run() {

            BufferedReader br = new BufferedReader(new InputStreamReader(this.is));

            String str = null;

            StringBuilder sb = new StringBuilder();

            try {

                while ((str = br.readLine()) != null){

                    sb.append(str+”\n”);

                }

                System.out.println(sb.toString());

            } catch (Exception e) {

                e.printStackTrace();

            } finally {

                if (br != null) {

                    try {

                        br.close();

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }

        }

    }

}

java壓縮文件怎麼賦權到文件夾

java壓縮包內的指定文件夾…

1. 壓縮成ZIP 方法1 *@paramsrcDir 壓縮文件夾路徑 *@paramout 壓縮文件輸出流 *@paramKeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構;

2. 壓縮成ZIP 方法2 *@paramsrcFiles 需要壓縮的文件列表

如何用java 將文件加密壓縮為zip文件.

用java加密壓縮zip文件:

package com.ninemax.demo.zip.decrypt;

import java.io.File;

import java.io.IOException;

import java.util.List;

import java.util.zip.DataFormatException;

import org.apache.commons.io.FileUtils;

import de.idyl.winzipaes.AesZipFileDecrypter;

import de.idyl.winzipaes.AesZipFileEncrypter;

import de.idyl.winzipaes.impl.AESDecrypter;

import de.idyl.winzipaes.impl.AESDecrypterBC;

import de.idyl.winzipaes.impl.AESEncrypter;

import de.idyl.winzipaes.impl.AESEncrypterBC;

import de.idyl.winzipaes.impl.ExtZipEntry;

/**

* 壓縮指定文件或目錄為ZIP格式壓縮文件

* 支持中文(修改源碼後)

* 支持密碼(僅支持256bit的AES加密解密)

* 依賴bcprov項目(bcprov-jdk16-140.jar)

*

* @author zyh

*/

public class DecryptionZipUtil {

/**

* 使用指定密碼將給定文件或文件夾壓縮成指定的輸出ZIP文件

* @param srcFile 需要壓縮的文件或文件夾

* @param destPath 輸出路徑

* @param passwd 壓縮文件使用的密碼

*/

public static void zip(String srcFile,String destPath,String passwd) {

AESEncrypter encrypter = new AESEncrypterBC();

AesZipFileEncrypter zipFileEncrypter = null;

try {

zipFileEncrypter = new AesZipFileEncrypter(destPath, encrypter);

/**

* 此方法是修改源碼後添加,用以支持中文文件名

*/

zipFileEncrypter.setEncoding(“utf8”);

File sFile = new File(srcFile);

/**

* AesZipFileEncrypter提供了重載的添加Entry的方法,其中:

* add(File f, String passwd)

* 方法是將文件直接添加進壓縮文件

*

* add(File f, String pathForEntry, String passwd)

* 方法是按指定路徑將文件添加進壓縮文件

* pathForEntry – to be used for addition of the file (path within zip file)

*/

doZip(sFile, zipFileEncrypter, “”, passwd);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

zipFileEncrypter.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 具體壓縮方法,將給定文件添加進壓縮文件中,並處理壓縮文件中的路徑

* @param file 給定磁碟文件(是文件直接添加,是目錄遞歸調用添加)

* @param encrypter AesZipFileEncrypter實例,用於輸出加密ZIP文件

* @param pathForEntry ZIP文件中的路徑

* @param passwd 壓縮密碼

* @throws IOException

*/

private static void doZip(File file, AesZipFileEncrypter encrypter,

String pathForEntry, String passwd) throws IOException {

if (file.isFile()) {

pathForEntry += file.getName();

encrypter.add(file, pathForEntry, passwd);

return;

}

pathForEntry += file.getName() + File.separator;

for(File subFile : file.listFiles()) {

doZip(subFile, encrypter, pathForEntry, passwd);

}

}

/**

* 使用給定密碼解壓指定壓縮文件到指定目錄

* @param inFile 指定Zip文件

* @param outDir 解壓目錄

* @param passwd 解壓密碼

*/

public static void unzip(String inFile, String outDir, String passwd) {

File outDirectory = new File(outDir);

if (!outDirectory.exists()) {

outDirectory.mkdir();

}

AESDecrypter decrypter = new AESDecrypterBC();

AesZipFileDecrypter zipDecrypter = null;

try {

zipDecrypter = new AesZipFileDecrypter(new File(inFile), decrypter);

AesZipFileDecrypter.charset = “utf-8”;

/**

* 得到ZIP文件中所有Entry,但此處好像與JDK里不同,目錄不視為Entry

* 需要創建文件夾,entry.isDirectory()方法同樣不適用,不知道是不是自己使用錯誤

* 處理文件夾問題處理可能不太好

*/

ListExtZipEntry entryList = zipDecrypter.getEntryList();

for(ExtZipEntry entry : entryList) {

String eName = entry.getName();

String dir = eName.substring(0, eName.lastIndexOf(File.separator) + 1);

File extractDir = new File(outDir, dir);

if (!extractDir.exists()) {

FileUtils.forceMkdir(extractDir);

}

/**

* 抽出文件

*/

File extractFile = new File(outDir + File.separator + eName);

zipDecrypter.extractEntry(entry, extractFile, passwd);

}

} catch (IOException e) {

e.printStackTrace();

} catch (DataFormatException e) {

e.printStackTrace();

} finally {

try {

zipDecrypter.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 測試

* @param args

*/

public static void main(String[] args) {

/**

* 壓縮測試

* 可以傳文件或者目錄

*/

// zip(“M:\\ZIP\\test\\bb\\a\\t.txt”, “M:\\ZIP\\test\\temp1.zip”, “zyh”);

// zip(“M:\\ZIP\\test\\bb”, “M:\\ZIP\\test\\temp2.zip”, “zyh”);

unzip(“M:\\ZIP\\test\\temp2.zip”, “M:\\ZIP\\test\\temp”, “zyh”);

}

}

壓縮多個文件時,有兩個方法(第一種沒試):

(1) 預先把多個文件壓縮成zip,然後調用enc.addAll(inZipFile, password);方法將多個zip文件加進來。

(2)針對需要壓縮的文件循環調用enc.add(inFile, password);,每次都用相同的密碼。

java中zip壓縮和gzip壓縮的區別

一個zip可以內藏多個文件

狹義的gzip僅對單個文件壓縮,不能打包多個文件。

tar.gzip或tgz可以打包多個文件,屬於固實壓縮,壓縮比較高,但隨機存取單個文件的效率不如zip..

如何使用java壓縮文件夾成為zip包(最簡單的

import java.io.File;

public class ZipCompressorByAnt {

private File zipFile;

/**

* 壓縮文件構造函數

* @param pathName 最終壓縮生成的壓縮文件:目錄+壓縮文件名.zip

*/

public ZipCompressorByAnt(String finalFile) {

zipFile = new File(finalFile);

}

/**

* 執行壓縮操作

* @param srcPathName 需要被壓縮的文件/文件夾

*/

public void compressExe(String srcPathName) {

System.out.println(“srcPathName=”+srcPathName);

File srcdir = new File(srcPathName);

if (!srcdir.exists()){

throw new RuntimeException(srcPathName + “不存在!”);

}

Project prj = new Project();

Zip zip = new Zip();

zip.setProject(prj);

zip.setDestFile(zipFile);

FileSet fileSet = new FileSet();

fileSet.setProject(prj);

fileSet.setDir(srcdir);

//fileSet.setIncludes(“**/*.java”); //包括哪些文件或文件夾 eg:zip.setIncludes(“*.java”);

//fileSet.setExcludes(…); //排除哪些文件或文件夾

zip.addFileset(fileSet);

zip.execute();

}    

}

public class TestZip {

public static void main(String[] args) {

ZipCompressorByAnt zca = new ZipCompressorByAnt(“E:\\test1.zip “);

zca.compressExe(“E:\\test1”);

}  

}

/*如果 出現ant 的 52  51 50 等版本問題 可以去找對應的ant-1.8.2.jar     我開始用的ant-1.10.1.jar 就是這個包版本高了  一直報verson 52 版本問題*/

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159975.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:17
下一篇 2024-11-20 00:17

相關推薦

  • javazip,javazip追加文件

    本文目錄一覽: 1、如何使用java壓縮文件夾成為zip包(最簡單的 2、javazip壓縮包過大解壓失敗 3、怎樣用java快速實現zip文件的壓縮解壓縮 4、如何使用java壓…

    編程 2025-01-07
  • javazip解壓,javazip解壓縮

    本文目錄一覽: 1、javazip解壓過大失敗 2、如何在java中實現對zip和rar文件的解壓 3、javazip壓縮包過大解壓失敗 4、怎樣用java快速實現zip文件的壓縮…

    編程 2024-12-21

發表回復

登錄後才能評論