Java实现对压缩文件的解压(图形界面)

 核心代码:

读取指定压缩文件信息

package my;


import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ZipInfo
{
	public int fileCount; // zip文件里的文件个数
	public long totalSize; // zip文件里所有文件的总大小

	List<ZipEntry> entries = new ArrayList<>();

	// 显示的时候将文件夹排在前面,文件排在后面
	public void sort()
	{
		
	}

	// 工具方法: 从ZipFile中获取目录信息
	public static ZipInfo from(ZipFile zipFile) throws Exception
	{
		ZipInfo info = new ZipInfo();
		
		Enumeration<?> entries = zipFile.entries();
		while (entries.hasMoreElements())
		{
			ZipEntry entry = (ZipEntry) entries.nextElement();
			info.entries.add(entry);
			
			if ( !entry.isDirectory())
			{
				info.fileCount += 1; // 文件个数
				info.totalSize += entry.getSize();
			}
		}
		
		return info;
	}
}

解压:

package my;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import javax.swing.SwingUtilities;

public class ZipExtractTask extends Thread
{
	MyFrame ui; // 窗口界面

	File srcFile; // *.zip 文件
	File dstDir; // 解压缩的目标目录
	ZipInfo zipInfo;
	
	public ZipExtractTask(MyFrame ui)
	{
		this.ui = ui;
	}

	public void execute(File srcFile, File dstDir, ZipInfo zipInfo)
	{
		this.srcFile = srcFile;
		this.dstDir = dstDir;
		this.zipInfo = zipInfo;
		this.start();
	}

	@Override
	public void run()
	{
		dstDir.mkdirs();
		
		ZipFile zipFile = null;
		try {
			zipFile = new ZipFile(srcFile, Charset.forName("GBK"));
			extract (zipFile);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}finally {
			try{ zipFile.close();}catch(Exception e) {}
		}
				
		// 最后要记得关闭文件
		SwingUtilities.invokeLater( ()->{
			done();
		});
	}
	
	private void extract(ZipFile zipFile) throws Exception
	{
		long lastTime = System.currentTimeMillis();
		int count = 0;
		
		// 遍历每一条
		Enumeration<?> entries = zipFile.entries();
		while (entries.hasMoreElements())
		{
			ZipEntry entry = (ZipEntry) entries.nextElement();
			if (entry.isDirectory())continue;
	
			System.out.println("处理文件:" + entry.getName());
	
			File dstFile = new File(dstDir, entry.getName());
			dstFile.getParentFile().mkdirs(); // 创建所在的子目录
	
			// 从zip文件中解出数据
			InputStream inputStream = zipFile.getInputStream(entry);
			OutputStream outputStream = new FileOutputStream(dstFile);
			try
			{
				byte[] buf = new byte[8192];
				while (true)
				{
					int n = inputStream.read(buf);
					if (n <= 0)	break;
					outputStream.write(buf, 0, n);
					
					// 为了增强演示效果,使之变慢一些
					Thread.sleep(500);
					
					// 每0.5秒更新一次界面
					count += 1;
					long now = System.currentTimeMillis();
					if(now - lastTime > 500)
					{
						lastTime = now;
						showProgress( count , zipInfo.fileCount);
						Thread.sleep(50);
					}
				}
			} finally
			{
				// 确保文件被关闭
				try	{ inputStream.close();} catch (Exception e){}
				try	{ outputStream.close();	} catch (Exception e){}
			}
		}
	}
	
	// 显示进度
	private void showProgress(int count, int total)
	{
		final int progress = 100 *count / total;
		SwingUtilities.invokeLater( ()->{
			ui.waitDialog.setProgress( progress );
		});
	}
	
	// 任务完成后的处理
	private void done()
	{
		if(ui.waitDialog != null)
		{
			ui.waitDialog.setVisible(false);
			ui.waitDialog = null;
		}		
	}

}

 

 

需要全部代码的可以联系,免费.....

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值