`

调用org.apache.tools.zip包,从压缩包中提取文件

    博客分类:
  • Java
阅读更多
import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.apache.tools.zip.*;

//调用org.apache.tools.zip包,从压缩包中提取文件

public class ZipExtractDemo extends JFrame {

	private static final long serialVersionUID = 1L;
	JFileChooser fileChooser; // 文件选择器
	JTextField jtfTarget; // 待解压文件路径
	JButton jbSelected; // 选择文件按钮
	JList files; // 信息显示列表框
	JButton jbExtract; // 解压按钮
	ZipFile zFile;

	public ZipExtractDemo() {
		super("从压缩包中提取文件"); // 调用父类构造函数
		fileChooser = new JFileChooser(); // 实例化组件
		jtfTarget = new JTextField(13);
		jbSelected = new JButton("选择");
		jbExtract = new JButton("解压");
		files = new JList();
		JPanel panel = new JPanel(); // 实例化面板
		panel.add(new JLabel("目标文件"));
		panel.add(jtfTarget); // 增加组件到面板上
		panel.add(jbSelected);
		panel.add(jbExtract);
		JScrollPane jsp = new JScrollPane(files);
		// jsp.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //
		// 设置边界
		Container container = getContentPane(); // 得以容器
		container.add(panel, BorderLayout.NORTH); // 增加组件到容器上
		container.add(jsp, BorderLayout.CENTER);

		jbSelected.addActionListener(new ActionListener() { // 文件选择按钮事件处理
					public void actionPerformed(ActionEvent event) {
						// 弹出文件选择器,并判断是否点击了打开按钮
						if (fileChooser.showOpenDialog(ZipExtractDemo.this) == JFileChooser.APPROVE_OPTION) {
							String fileName = fileChooser.getSelectedFile()
									.getAbsolutePath(); // 得到选择文件的绝对路径
							jtfTarget.setText(fileName); // 设置目标文件名
							// showFiles(); // 显示压缩包内容
							addFileToCompress("d:\\about.txt", fileName,
									"D:\\test.jar");
						}
					}
				});

		jbExtract.addActionListener(new ActionListener() { // 解压文件按钮事件处理
					public void actionPerformed(ActionEvent event) {
						extractFile(files.getSelectedValue().toString()); // 解压指定文件
						System.out.println("解压:"
								+ files.getSelectedValue().toString());
					}
				});

		setSize(350, 250); // 设置窗口尺寸
		setVisible(true); // 设置窗口可视
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
	}

	/**
	 * ********添加或覆盖一个文件到指定的压缩包中,参数一:资源文件路径,即需要添加的文件;*****
	 * ********参数二:压缩包的路径;参数三:添加文件后生成新的压缩包的路径*****
	 */
	public void addFileToCompress(String res, String com, String out) {
		try {
			// 如果res文件与其它文件相同,此值将设为true并让res覆盖原有文件,
			// 如果最后此值为false,则添加res文件
			boolean same = false;
			System.out.println("资源文件路径" + res + " , " + com);
			int index = res.lastIndexOf("\\") + 1;// 得到最后一个"\"符号的索引
			String name = res.substring(index, res.length());// 截取文件名
			// 文件输出流,生成out路径,也可以用此流写入数据并生成文件
			FileOutputStream fos = new FileOutputStream(out);
			// 压缩输出流,通过此流把数据写放压缩包中
			ZipOutputStream zOut = new ZipOutputStream(fos);
			// 压缩文件包,用于从压缩文件中读取条目
			ZipFile zFile = new ZipFile(com);
			// 取得遍历条目对象
			Enumeration enu = zFile.getEntries();
			while (enu.hasMoreElements()) {// 判断是否有下一个遍历对象
				// 取得遍历到的对象
				ZipEntry zEntry = (ZipEntry) enu.nextElement();
				// 得到对象名称,它包涵目录路径
				String zEnName = zEntry.getName();
				// 得到最后一个"/"符号的索引
				int zEnIndex = zEnName.lastIndexOf("/") + 1;
				// 去除目录路径,取得纯文件名
				String zEnSubName = zEnName.substring(zEnIndex, zEnName
						.length());
				// 设置下一个要创建的Entry对象
				zOut.putNextEntry(zEntry);
				// 判断名字是否一致,如果一致则写入指定的文件,否则写入原来的文件
				if (zEnSubName.equals(name)) {
					// 文件输入流
					FileInputStream fis = new FileInputStream(res);
					int len;// 长度
					// 读取数据直到读完为止
					while ((len = fis.read()) != -1)
						zOut.write(len);
					// 关闭输入流
					fis.close();
					same = true;
				} else {
					// 文件输入流
					InputStream is = zFile.getInputStream(zEntry);
					int len;// 长度
					// 读取数据直到读完为止
					while ((len = is.read()) != -1)
						zOut.write(len);
					// 关闭输入流
					is.close();
				}
			}
			if (same == false) {
				// 设置下一个要创建的Entry对象
				zOut.putNextEntry(new ZipEntry(name));
				// 文件输入流
				FileInputStream fis = new FileInputStream(res);
				int len;// 长度
				// 读取数据直到读完为止
				while ((len = fis.read()) != -1)
					zOut.write(len);
				// 关闭输入流
				fis.close();
			}
			// 关闭压缩输入流,此步骤是必须的,如果没有关闭则会让生成压缩包损坏
			zOut.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** 参数一:压缩输出流对象(此流用于写入数据并生成文件),参数二:需要压缩的File对象,参数三:根目录,即压缩包中的文件夹目录 */
	public void zip(ZipOutputStream zOut, File file, String base) {
		try {
			System.out.println("正在压缩-->" + file.getName());
			if (file.isDirectory()) {
				File[] listFiles = file.listFiles();
				/*
				 * 此处解决压缩未端数据不正确,这是判断当前是什么系统,普遍是Windows所以在这里就不注释不做此判断. if
				 * (System.getProperty("os.name").startsWith("Windows")) { base =
				 * base.length() == 0 ? "" : base + "\\"; out.putNextEntry(new
				 * ZipEntry(base)); } else { base = base.length() == 0 ? "" :
				 * base + "/"; out.putNextEntry(new ZipEntry(base)); }
				 * 一般来说用"/"符号来分割出文件与文件夹是没有问题的
				 */
				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(fl[i].getName().getBytes("gb2312")));
				}
			} else {
				if (base == "") {
					base = file.getName();
				}
				zOut.putNextEntry(new ZipEntry(base));
				FileInputStream in = new FileInputStream(file);
				int len;
				while ((len = in.read()) != -1)
					zOut.write(len);
				in.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void showFiles() {
		try {
			zFile = new ZipFile(jtfTarget.getText()); // 得到压缩文件实例
			ZipEntry entry;
			Vector vec = new Vector(); // 文件枚举
			Enumeration enu = zFile.getEntries(); // 得到压缩条目的枚举对象
			while (enu.hasMoreElements()) { // 依次枚举条目
				entry = (ZipEntry) enu.nextElement(); // 得到压缩条目
				vec.add(entry.getName()); // 增加文件到Vector内
			}
			files.setListData(vec); // 设置文件列表框数据
			files.getSelectedValues();
		} catch (Exception ex) {
			ex.printStackTrace(); // 输出错误信息
		}
	}

	public void extractFile(String name) { // 解压文件
		try {
			ZipEntry entry = zFile.getEntry(name);
			entry.getComment();
			entry.getCompressedSize();
			entry.getCrc();
			entry.isDirectory();
			entry.getSize();
			entry.getMethod();
			InputStream in = zFile.getInputStream(entry); // 得到文件输入流
			File file = new File("D://index.txt"); // 实例化文件对象
			FileOutputStream out = new FileOutputStream(file); // 得到文件输出流
			byte[] buffer = new byte[1024]; // 缓冲区大小
			int length = 0;
			while ((length = in.read(buffer)) != -1) { // 循环读取数据
				out.write(buffer, 0, length); // 写数据到输出流
			}
			JOptionPane.showMessageDialog(ZipExtractDemo.this, "解压成功,解压到:"
					+ file.getAbsolutePath());
			in.close(); // 关闭输入流
			out.close(); // 关闭输出流
		} catch (Exception ex) {
		}
	}

	public static void main(String[] args) {
		new ZipExtractDemo();
	}
}

 

分享到:
评论

相关推荐

    ant-1.7.1(org.apache.tools.zip.ZipOutputStream).zip

    总之,`ant-1.7.1(org.apache.tools.zip.ZipOutputStream).zip`这个压缩包展示了在使用Apache Ant处理包含中文文件名的Zip文件时,如何通过设置正确的字符编码来避免乱码问题。理解和掌握这些知识点对于Java开发者来...

    apache压缩文件

    在"apache-maven-3.3.9"这个压缩包中,包含了一系列文件和目录,它们构成了Maven的完整安装包。以下是一些关键组成部分及其功能: 1. **bin** 目录:包含了可执行脚本,如`mvn`和`mvn.cmd`,分别用于Unix/Linux和...

    apache-cxf-3.5.0.zip

    这个"apache-cxf-3.5.0.zip"压缩包包含了CXF的3.5.0版本,该版本提供了对Web服务的全面支持,包括服务的创建、部署和消费。CXF是基于SOAP和RESTful服务的,同时也支持多种协议如HTTP、JMS等。 "wsdl2java"工具是...

    eclipse axis2插件安装

    Eclipse Axis2 插件可以自动生成 .arr 文件,我们可以从 http://axis.apache.org/axis2/java/core/tools/index.html 下载两个文件,放到 Eclipse 的 droppings 文件夹下。重新启动 Eclipse,插件安装成功。 三、...

    java文件压缩源码

    2. **`Zip`类的使用**:`Zip`类是`org.apache.tools.ant.taskdefs.Zip`包下的核心类,它提供了一个构造函数,可以接受一个`OutputStream`对象,这个`OutputStream`通常是准备写入ZIP文件的`FileOutputStream`。...

    geotools-26.1-bin.zip

    这个压缩包“geotools-26.1-bin.zip”包含了GeoTools的26.1版本,是开发者进行GIS应用开发的重要资源。在本文中,我们将深入探讨GeoTools的核心特性、主要功能以及如何利用它进行地理空间数据的处理和展示。 1. **...

    doris-ssb-tools.zip

    【标题】"doris-ssb-tools.zip" 是一个与Apache Doris相关的工具包,它包含了一系列用于管理和操作Doris数据库的脚本和配置文件。这个压缩包的主要目的是支持SSB(Star Schema Benchmark)的数据加载和查询测试。 ...

    test tools.zip

    "test tools.zip"这个压缩包可能包含了多种用于Linux环境的测试工具,主要用于压力测试。压力测试是一种评估系统在高负载或大量并发请求下的性能和稳定性的测试方法。 一、压力测试工具 1. **Apache JMeter**:这...

    apache-cxf-2.2.10.zip

    在"apache-cxf-2.2.10.zip"压缩包中,你会找到以下组件: - **bin**:包含可执行脚本,如启动和停止服务器的命令。 - **conf**:配置文件,如日志设置、服务配置等。 - **lib**:必要的库文件,包括CXF的核心库和...

    args4j-tools-2.0.4.jar.zip

    在args4j-tools-2.0.4.jar.zip压缩包中,包含的主要文件有args4j-tools-2.0.4.jar和args4j-1.0-RC.license.txt。args4j-tools-2.0.4.jar是args4j工具库的可执行版本,包含了所有你需要的类和方法,可以直接在项目中...

    ant-launcher.jar.zip

    在描述中提到了"jar.zip包下载",这通常指的是Ant-Launcher.jar被封装在一个名为"ant-launcher.jar.zip"的zip文件中,便于用户下载和分发。这种做法减少了文件体积,便于在网络上传输,同时简化了用户的安装和管理...

    ant-xslp-1.6.2.jar.zip

    &lt;taskdef name="xslt" classname="org.apache.tools.ant.taskdefs.optional.xslt.XSLTProcess" classpathref="classpath"/&gt; &lt;xslt in="input.xml" out="output.html" style="transform.xsl"/&gt; ``` 在这个例子...

    alfresco-devenv-tools.jar.zip

    下载后,我们需要将其解压缩,然后将`alfresco-devenv-tools.jar`添加到开发环境的类路径(Classpath)中,以便于调用其中的工具和功能。 在使用`alfresco-devenv-tools.jar`时,我们通常会配合其他开发工具,如...

    Xerces-J-tools.1.2.1.zip

    本文将围绕"Xerces-J-tools.1.2.1.zip"这个压缩包文件,详细介绍Xerces和SAX解析器的相关知识。 Xerces是一个开源的XML解析器,由Apache软件基金会维护,主要针对Java平台,即Xerces-J。它提供了对DOM(Document ...

    Xerces-J-tools.2.3.0.zip

    Xerces-J-tools.2.3.0.zip是一个包含Xerces库早期版本的压缩包,专注于SAX(Simple API for XML)XML解析器。Xerces是Apache软件基金会开发的一个开源XML解析器,它提供了对DOM(Document Object Model)、SAX以及...

    Xerces-J-tools.2.0.0.zip

    Xerces-J-tools.2.0.0.zip是一个包含Xerces库不同版本的压缩包,主要关注的是Xerces的SAX(Simple API for XML)XML解析器。Xerces是由Apache软件基金会开发的一款开源、高性能的XML处理工具,它提供了XML解析、DOM...

    velocity1.7

    在 "velocity1.7.zip" 压缩包中,通常包含以下内容: - `velocity.jar`: 主要的 Velocity 框架库,包含了所有必需的类和资源。 - `velocity-tools*.jar`: 用于提供额外的工具和功能,比如视图助手、验证器等。 - `...

    ant-junit-1.6.3.jar.zip

    《Ant与JUnit结合:深入解析...ant-junit-1.6.3.jar.zip压缩包内包含的ant-junit-1.6.3.jar是核心文件,它提供Ant与JUnit的桥梁。开发者在build.xml文件中通过标签引入该库,然后使用任务来执行测试。例如: ```xml ...

    Xerces-J-tools.2.2.0.zip

    Xerces-J-tools.2.2.0.zip是一个包含Xerces库相关工具的压缩包,其中的"tools"目录可能包含了各种用于处理XML文档的实用程序,而"META-INF"目录则通常存放关于该库元数据的信息。Xerces是一个著名的开源XML解析器,...

Global site tag (gtag.js) - Google Analytics