java,zip压缩,解压。

功能:zip压缩、解压(支持中文文件名)
说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
   解决了由于java.util.zip包不支持汉字的问题。
   使用java.util.zip包时,当zip文件中有名字为中文的文件时,
   就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
注意:
   1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
   2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
   3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]

/**
     * 解压zip格式的压缩文件
     * 
     * @param zipFileName
     *            压缩文件
     * @param extPlace
     *            解压目录
     * @throws Exception
     */
    public static void unzip(String zipFileName, String extPlace)
            throws Exception {
        try {
            ZipFile zipFile = new ZipFile(zipFileName);
            Enumeration e = zipFile.getEntries();
            ZipEntry zipEntry = null;
            while (e.hasMoreElements()) {
                zipEntry = (ZipEntry) e.nextElement();
                String entryName = zipEntry.getName();
                String names[] = entryName.split("/");
                int length = names.length;
                String path = extPlace + File.separator;
                for (int v = 0; v < length; v++) {
                    if (v < length - 1) {
                        path += names[v] + "/";
                        System.out.println(path);
                        new File(path).mkdirs();
                    } else { // 最后一个
                        if (entryName.endsWith("/")) { // 为目录,则创建文件夹
                            new File(extPlace + File.separator + entryName).mkdirs();
                        } else {
                            InputStream in = zipFile.getInputStream(zipEntry);
                            File outentity = new File(extPlace+ File.separator +entryName);
                            if(outentity.exists()){
                                outentity.createNewFile();
                            }
                            OutputStream os = new FileOutputStream(outentity);
                            byte[] buf = new byte[BUFFEREDSIZE];
                            int len;
                            while ((len = in.read(buf)) > 0) {
                                os.write(buf, 0, len);
                            }
                            in.close();
                            os.close();
                        }
                    }
                }
            }
            zipFile.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
//-----------------------------------------------------------------------------------------------

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 

import org.apache.tools.zip.*; 


public class ZipCompress { 



public void zip(String inputFile, String zipFileName) { 

zip(new File(inputFile), zipFileName); 

} 





public void zip(File inputFile, String zipFileName) { 


try { FileOutputStream out = new FileOutputStream(new String(zipFileName.getBytes("gb2312"))); //创建文件输出对象out,提示:注意中文支持 
ZipOutputStream zOut = new ZipOutputStream(out); 

System.out.println("压缩-->开始"); 

zip(zOut, inputFile, ""); 

System.out.println("压缩-->结束"); 

zOut.close(); 

} catch (Exception e) { 

e.printStackTrace(); 

} 

} 



public void zip(ZipOutputStream zOut, File file, String base) { 

try { 

System.out.println("正在压缩-->" + file.getName()); 

if (file.isDirectory()) { 

File[] listFiles = file.listFiles(); 

zOut.putNextEntry(new ZipEntry(base + "/")); 

base =( base.length() == 0 ? "" : base + "/" ); 

for (int i = 0; i < listFiles.length; i++) { 

zip(zOut, listFiles[i], base + listFiles[i].getName()); 

// System.out.println(new String(listFiles[i].getName().getBytes("gb2312"))); 

} 

} else { 

if (base == "") { 

base = file.getName(); 

} 

zOut.putNextEntry(new ZipEntry(base)); 

System.out.println(file.getPath() + "," + base); 

FileInputStream in = new FileInputStream(file); 

int len; 

while ((len = in.read()) != -1) 

zOut.write(len); 

in.close(); 

} 

} catch (Exception e) { 

e.printStackTrace(); 

} 

} 

private void createDirectory(String directory, String subDirectory) { 

String dir[]; 

File fl = new File(directory); 

try { 

if (subDirectory == "" && fl.exists() != true) 

fl.mkdir(); 

else if (subDirectory != "") { 

dir = subDirectory.replace('\\', '/').split("/"); 

for (int i = 0; i < dir.length; i++) { 

File subFile = new File(directory + File.separator + dir[i]); 

if (subFile.exists() == false) 

subFile.mkdir(); 

directory += File.separator + dir[i]; 

} 

} 

} catch (Exception ex) { 

System.out.println(ex.getMessage()); 

} 

} 

public void unZip(String zipFileName, String outputDirectory) { 

try { 

ZipFile zipFile = new ZipFile(zipFileName); 

java.util.Enumeration e = zipFile.getEntries(); 

ZipEntry zipEntry = null; 

createDirectory(outputDirectory, ""); 

while (e.hasMoreElements()) { 

zipEntry = (ZipEntry) e.nextElement(); 

System.out.println("正在解压: " + zipEntry.getName()); 

String name = null; 

if (zipEntry.isDirectory()) { 

name = zipEntry.getName(); 

name = name.substring(0, name.length() - 1); 

File f = new File(outputDirectory + File.separator + name); 

f.mkdir(); 

System.out.println("创建目录:" + outputDirectory + File.separator + name); 

} else { 

String fileName = zipEntry.getName(); 

fileName = fileName.replace('\\', '/'); 

// System.out.println("测试文件1:" +fileName); 

if (fileName.indexOf("/") != -1) { 

createDirectory(outputDirectory, fileName.substring(0, fileName.lastIndexOf 

("/"))); 

fileName = fileName.substring( 

fileName.lastIndexOf("/") + 1, fileName.length()); 

} 

File f = new File(outputDirectory + File.separator + zipEntry.getName()); 

f.createNewFile(); 

InputStream in = zipFile.getInputStream(zipEntry); 

FileOutputStream out = new FileOutputStream(f); 

byte[] by = new byte[1024]; 

int c; 

while ((c = in.read(by)) != -1) { 

out.write(by, 0, c); 

} 

out.close(); 

in.close(); 

} 

// 删除文件不能在这里删,因为文件正在使用,应在上传那处删 

// 解压后,删除压缩文件 

// File zipFileToDel = new File(zipFileName); 

// zipFileToDel.delete(); 

// System.out.println("正在删除文件:"+ zipFileToDel.getCanonicalPath()); 

// //删除解压后的那一层目录 

// delALayerDir(zipFileName, outputDirectory); 

}}catch (Exception ex) { 

System.out.println(ex.getMessage()); 

} 

} 
/** 
* 删掉一层目录 
* @param zipFileName 
* @param outputDirectory 
*/ 
public void delALayerDir(String zipFileName, String outputDirectory) { 

String[] dir = zipFileName.replace('\\', '/').split("/"); 

String fileFullName = dir[dir.length - 1]; 

int pos = -1; 

pos = fileFullName.indexOf("."); 

String fileName = fileFullName.substring(0, pos); 

String sourceDir = outputDirectory + File.separator + fileName; 

try { 

copyFile(new File(outputDirectory), new File(sourceDir), new File(sourceDir)); 

deleteSourceBaseDir(new File(sourceDir)); 

} catch (Exception e) { 

e.printStackTrace(); 

} 

} 


/** 
* 将sourceDir目录的文件全部copy到destDir中去 
*/ 
public void copyFile (File destDir, File sourceBaseDir, File sourceDir) throws Exception{ 

File[] lists = sourceDir.listFiles(); 

if (lists == null) 

return; 

for (int i = 0; i < lists.length; i++) { 

File f = lists[i]; 

if (f.isFile()) { 

FileInputStream fis = new FileInputStream(f); 

String content = ""; 

String sourceBasePath = sourceBaseDir.getCanonicalPath(); 

String fPath = f.getCanonicalPath(); 

String drPath = destDir + fPath.substring(fPath.indexOf 

(sourceBasePath) + sourceBasePath.length()); 

FileOutputStream fos = new FileOutputStream(drPath); 

byte[] b = new byte[2048]; 

while (fis.read(b) != -1) { 

if (content != null) 

content += new String(b); 

else 

content = new String(b); 

b = new byte[2048]; 

} 



content = content.trim(); 

fis.close(); 

fos.write(content.getBytes()); 

fos.flush(); 

fos.close(); 

} else { 

// 先新建目录 

new File(destDir + File.separator + f.getName()).mkdir(); 

copyFile(destDir, sourceBaseDir, f); // 递归调用 

} 

} 

} 

/* 
* 将sourceDir目录的文件全部copy到destDir中去 
**/ 
public void deleteSourceBaseDir(File curFile) throws Exception { 

File[] lists = curFile.listFiles(); 

File parentFile = null; 

for (int i = 0; i < lists.length; i++) { 

File f = lists[i]; 

if (f.isFile()) { 

f.delete(); 

// 若它的父目录没有文件了,说明已经删完,应该删除父目录 

parentFile = f.getParentFile(); 

if (parentFile.list().length == 0) 

parentFile.delete(); 

} else { 

deleteSourceBaseDir(f); // 递归调用 

} 

} 

}

//测试代码

public static void main(String[] args) {      
  
    ZipCompress t = new ZipCompress();      
  
    // 这里是调用压缩的代码      
  
     t.zip("c:\\test", "c:\\test.rar");    
  
    // 这里是调用解压缩的代码      
  
     t.unZip("c:\\test.rar", "c:\\test1");      
  
} http://blog.163.com/fzyuan_10/blog/static/2076023962012519171904/

  • 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、付费专栏及课程。

余额充值