java unzip_使用java.util.zip实现zip压缩和解压

import java.io.*;

import java.util.zip.*;

/**

*功能:zip压缩、解压

*说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.

*问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,

*     就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException

*               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)

*解决:

*  方法1、修改import java.util.zip.ZipInputStream和ZipOutputStream.

*          java.util.zip只支持UTF-8,Ant里面可以指定编码.

*  方法2、使用Apache Ant里提供的zip工具。

*          不使用java.util.zip的包,把ant.jar放到classpath中.

*          程序中使用import org.apache.tools.zip.*;

*

*仅供编程学习参考.

*

*@author Winty

*@date   2008-8-3

*@Usage:

*   压缩:java Zip -zip "directoryName"

*   解压:java Zip -unzip "fileName.zip"

*/

public class Zip{

private ZipInputStream  zipIn;      //解压Zip

private ZipOutputStream zipOut;     //压缩Zip

private ZipEntry        zipEntry;

private static int      bufSize;    //size of bytes

private byte[]          buf;

private int             readedBytes;

public Zip(){

this(512);

}

public Zip(int bufSize){

this.bufSize = bufSize;

this.buf = new byte[this.bufSize];

}

//压缩文件夹内的文件

public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名

File file;

File zipDir;

zipDir = new File(zipDirectory);

String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名

try{

this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));

handleDir(zipDir , this.zipOut);

this.zipOut.close();

}catch(IOException ioe){

ioe.printStackTrace();

}

}

//由doZip调用,递归完成目录文件读取

private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{

FileInputStream fileIn;

File[] files;

files = dir.listFiles();

if(files.length == 0){//如果目录为空,则单独创建之.

//ZipEntry的isDirectory()方法中,目录以"/"结尾.

this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));

this.zipOut.closeEntry();

}

else{//如果目录不为空,则分别处理目录和文件.

for(File fileName : files){

//System.out.println(fileName);

if(fileName.isDirectory()){

handleDir(fileName , this.zipOut);

}

else{

fileIn = new FileInputStream(fileName);

this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));

while((this.readedBytes = fileIn.read(this.buf))>0){

this.zipOut.write(this.buf , 0 , this.readedBytes);

}

this.zipOut.closeEntry();

}

}

}

}

//解压指定zip文件

public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名

FileOutputStream fileOut;

File file;

try{

this.zipIn = new ZipInputStream (new BufferedInputStream(new FileInputStream(unZipfileName)));

while((this.zipEntry = this.zipIn.getNextEntry()) != null){

file = new File(this.zipEntry.getName());

//System.out.println(file);///

if(this.zipEntry.isDirectory()){

file.mkdirs();

}

else{

//如果指定文件的目录不存在,则创建之.

File parent = file.getParentFile();

if(!parent.exists()){

parent.mkdirs();

}

fileOut = new FileOutputStream(file);

while(( this.readedBytes = this.zipIn.read(this.buf) ) > 0){

fileOut.write(this.buf , 0 , this.readedBytes );

}

fileOut.close();

}

this.zipIn.closeEntry();

}

}catch(IOException ioe){

ioe.printStackTrace();

}

}

//设置缓冲区大小

public void setBufSize(int bufSize){

this.bufSize = bufSize;

}

//测试Zip类

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

if(args.length==2){

String name = args[1];

Zip zip = new Zip();

if(args[0].equals("-zip"))

zip.doZip(name);

else if(args[0].equals("-unzip"))

zip.unZip(name);

}

else{

System.out.println("Usage:");

System.out.println("压缩:java Zip -zip directoryName");

System.out.println("解压:java Zip -unzip fileName.zip");

throw new Exception("Arguments error!");

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Java中的Zip文件压缩解压缩操作,可以使用Java提供的ZipInputStream和ZipOutputStream类。下面是一个简单的示例代码,展示如何高效地解压Zip文件: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipUtils { public static void unzip(String zipFilePath, String destDirectory) throws IOException { File destDir = new File(destDirectory); if (!destDir.exists()) { destDir.mkdir(); } ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { String filePath = destDirectory + File.separator + entry.getName(); if (!entry.isDirectory()) { extractFile(zipIn, filePath); } else { File dir = new File(filePath); dir.mkdir(); } zipIn.closeEntry(); entry = zipIn.getNextEntry(); } zipIn.close(); } private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); byte[] bytesIn = new byte[4096]; int read = 0; while ((read = zipIn.read(bytesIn)) != -1) { bos.write(bytesIn, 0, read); } bos.close(); } } ``` 示例代码中的`unzip`方法接收两个参数:`zipFilePath`表示要解压缩的Zip文件的路径,`destDirectory`表示解压缩后的文件存放目录。代码首先创建目标文件夹,然后打开Zip文件并逐个读取其中的ZipEntry,如果是文件就解压缩到目标文件夹,如果是目录就创建对应的目录。解压缩过程中使用了`BufferedOutputStream`来提高效率。 要实现Zip文件的压缩,可以使用Java提供的ZipEntry和ZipOutputStream类。下面是一个简单的示例代码,展示如何压缩一个文件或目录为Zip文件: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtils { public static void zip(String sourceFile, String zipFilePath) throws IOException { FileOutputStream fos = new FileOutputStream(zipFilePath); ZipOutputStream zipOut = new ZipOutputStream(fos); File fileToZip = new File(sourceFile); zipFile(fileToZip, fileToZip.getName(), zipOut); zipOut.close(); fos.close(); } private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException { if (fileToZip.isHidden()) { return; } if (fileToZip.isDirectory()) { File[] children = fileToZip.listFiles(); for (File childFile : children) { zipFile(childFile, fileName + "/" + childFile.getName(), zipOut); } return; } FileInputStream fis = new FileInputStream(fileToZip); ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); } fis.close(); } } ``` 示例代码中的`zip`方法接收两个参数:`sourceFile`表示要压缩的文件或目录的路径,`zipFilePath`表示压缩后的Zip文件路径。代码首先创建ZipOutputStream并打开输出文件,然后递归地压缩文件或目录中的所有文件,最后关闭输出流。压缩过程中使用了`FileInputStream`和`ZipEntry`来逐个读取文件并写入Zip文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值