我已经使用Java创建了zip文件,如下所示
import java.io.*; import java.util.zip.*; public class ZipCreateExample { public static void main(String[] args) throws IOException { System.out.print("Please enter file name to zip : "); BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String filesToZip = input.readLine(); File f = new File(filesToZip); if(!f.exists()) { System.out.println("File not found."); System.exit(0); } System.out.print("Please enter zip file name : "); String zipFileName = input.readLine(); if (!zipFileName.endsWith(".zip")) zipFileName = zipFileName + ".zip"; byte[] buffer = new byte[18024]; try { ZipOutputStream out = new ZipOutputStream (new FileOutputStream(zipFileName)); out.setLevel(Deflater.DEFAULT_COMPRESSION); FileInputStream in = new FileInputStream(filesToZip); out.putNextEntry(new ZipEntry(filesToZip)); int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } out.closeEntry(); in.close(); out.close(); } catch (IllegalArgumentException iae) { iae.printStackTrace(); System.exit(0); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); System.exit(0); } catch (IOException ioe) { ioe.printStackTrace(); System.exit(0); } } }
现在,我想在单击zip文件时提示我输入密码,然后解压缩zip文件。请任何帮助,我应该怎么走?
尝试以下基于以下代码Zip4j:
import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants; import org.apache.commons.io.FilenameUtils; import java.io.File; public class Zipper { private String password; private static final String EXTENSION = "zip"; public Zipper(String password) { this.password = password; } public void pack(String filePath) throws ZipException { ZipParameters zipParameters = new ZipParameters(); zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_ULTRA); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); zipParameters.setPassword(password); String baseFileName = FilenameUtils.getBaseName(filePath); String destinationZipFilePath = baseFileName + "." + EXTENSION; ZipFile zipFile = new ZipFile(destinationZipFilePath); zipFile.addFile(new File(filePath), zipParameters); } public void unpack(String sourceZipFilePath, String extractedZipFilePath) throws ZipException { ZipFile zipFile = new ZipFile(sourceZipFilePath + "." + EXTENSION); if (zipFile.isEncrypted()) { zipFile.setPassword(password); } zipFile.extractAll(extractedZipFilePath); } }
FilenameUtils来自Apache Commons IO。
FilenameUtils
Apache Commons IO
用法示例:
public static void main(String[] arguments) throws ZipException { Zipper zipper = new Zipper("password"); zipper.pack("encrypt-me.txt"); zipper.unpack("encrypt-me", "D:\\"); }