调用org.apache.tools.zip包,从压缩包中提取文件
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, base + listFiles.getName());
// System.out.println(new
// String(fl.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; // 缓冲区大小
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();
}
}
页:
[1]