Java 基于java.util.zip类压缩解压Zip文件
2015-05-28 10:18
441 查看
Windows 系统下的压缩解压软件Winzip,想必大家都用过或听说过。本例将利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能。当然,本例在功能上完全没有Winzip 等成熟的压缩软件那么强,也不能做的很强,本例仅仅是演示如何来使用java.util.zip 包中的类。其效果如下图所示,窗口下部的“Start”按钮控制压缩和解压的开始。当源文件是zip 格式时,如“d:\bois.zip”,表示这次操作是解压,因而目标文件将是一个目录,如“d:\aa”;当源文件是非zip
格式的文件时,表示此次操作是压缩,因而目标文件是一个zip 格式的文件。
实现方法和思路:先来看java.util.zip 包中的几个类:
1.ZipEntry 类表示zip 文件中的一个压缩文件或文件夹。一般可以利用如下的构造方法来创建一个该类对象(用于文件压缩时):
2.ZipFile 类用来从一个zip 文件中读取所有ZipEntry 对象。创建实例的构造方法:
参数file 表示File 对象表示的zip 文件,参数name 表示路径表示的zip 文件。读取ZipEntry 对象的方法:
返回一个包含有所有ZipEntry对象的Enumeration对象。使用Enumeration类的nextElement()方法得到ZipEntry 对象:
enum 是Enumeration类的实例。ZipFile 类中getInputStream()方法,可以打开一个ZipEntry 对象的输入流,用于解压文件。其原型如下:
3.ZipOutputStream 类,该类可用来压缩文件。通过调用putNextEntry()方法,可以打开一个ZipEntry 对象的输出流,其原型如下:
本例中通过使用ZipEntry 和ZipFile 类及其他文件输入输出流类来实现解压;通过使用ZipEntry和ZipOutputStream 类及其他的文件输入输出流类实现压缩。本例的压缩和解压只限于一个文件的情况。
程序代码
1.新建一个Project,取名为JZipDemo。
2.新建一个Application,取名为JZipDemo;主窗口取名为MainFrame,标题为JZipDemo。
3.在MainFrame类的设计窗口中添加一个JPanel 组件置于窗口的山部,并在其上添加两个
JLabel 组件和两个JTextField 组件;在设计窗口的中部添加一个JScrollPane,并在其上添加一个JTextArea 组件;在设计窗口的下部添加一个JButton 组件,具体的实现代码如下:
4.编写MainFrame类的初始化方法jbInit(),设置个组件的初始属性及相应的布局,添加JButton组件的事件监听器,代码如下:
5.编写JButton 组件的事件处理方法,当按钮按下时,完成解压或压缩。
6.编写文件解压方法unzip()。
7.编写文件压缩方法zip()。
view
source
print?
格式的文件时,表示此次操作是压缩,因而目标文件是一个zip 格式的文件。
实现方法和思路:先来看java.util.zip 包中的几个类:
1.ZipEntry 类表示zip 文件中的一个压缩文件或文件夹。一般可以利用如下的构造方法来创建一个该类对象(用于文件压缩时):
1 | public ZipEntry(String name) |
2 | //参数name 表示压缩的文件或目录的名称。 |
1 | public ZipFile(File file) |
2 | public ZipFile(String name) |
1 | public Enumeration entries() |
1 | ZipEntry ze = (ZipEntry) enum .nextElement(); |
1 | Public InputStream getInputStream(ZipEntry entry) throws IOException |
1 | public void putNextEntry(ZipFile e) throws IOException |
程序代码
1.新建一个Project,取名为JZipDemo。
2.新建一个Application,取名为JZipDemo;主窗口取名为MainFrame,标题为JZipDemo。
3.在MainFrame类的设计窗口中添加一个JPanel 组件置于窗口的山部,并在其上添加两个
JLabel 组件和两个JTextField 组件;在设计窗口的中部添加一个JScrollPane,并在其上添加一个JTextArea 组件;在设计窗口的下部添加一个JButton 组件,具体的实现代码如下:
01 | public class MainFrame extends JFrame { |
02 | private JPanel contentPane; |
03 | private BorderLayout borderLayout1 = new BorderLayout(); |
04 | private JScrollPane jScrollPane1 = new JScrollPane(); |
05 | private JTextArea jTextArea1 = new JTextArea(); |
06 | private JButton jButton1 = new JButton(); |
07 | private JPanel jPanel1 = new JPanel(); |
08 | private JTextField jTextField1 = new JTextField(); |
09 | private JTextField jTextField2 = new JTextField(); |
10 | private JLabel jLabel1 = new JLabel(); |
11 | private JLabel jLabel2 = new JLabel(); |
12 | private GridLayout gridLayout1 = new GridLayout(); |
13 | …… |
14 | } |
01 | private void jbInit() throws Exception { |
02 | //设置组件和窗口的属性布局,在窗口中添加这些组件 |
03 | //setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]"))); |
04 | contentPane = (JPanel) this .getContentPane(); |
05 | contentPane.setLayout(borderLayout1); |
06 | this .setSize( new Dimension( 461 , 307 )); |
07 | this .setTitle( "JZipDemo" ); |
08 | jTextArea1.setText( "unzip and zip information" ); |
09 | jButton1.setFont( new java.awt.Font( "Dialog" , 0 , 14 )); |
10 | jButton1.setToolTipText( "" ); |
11 | jButton1.setText( "start" ); |
12 | jButton1.addActionListener( new java.awt.event.ActionListener() { //添加JButton 的事件监听器 |
13 | public void actionPerformed(ActionEvent e) { |
14 | jButton1_actionPerformed(e); |
15 | } |
16 | }); |
17 | jLabel1.setFont( new java.awt.Font( "Dialog" , 0 , 12 )); |
18 | jLabel1.setHorizontalAlignment(SwingConstants.CENTER); |
19 | jLabel1.setText( "source path :" ); |
20 | jLabel2.setFont( new java.awt.Font( "Dialog" , 0 , 12 )); |
21 | jLabel2.setHorizontalAlignment(SwingConstants.CENTER); |
22 | jLabel2.setText( "dictation path :" ); |
23 | jPanel1.setLayout(gridLayout1); |
24 | gridLayout1.setColumns( 2 ); |
25 | gridLayout1.setHgap( 10 ); |
26 | gridLayout1.setRows( 2 ); |
27 | contentPane.add(jScrollPane1, BorderLayout.CENTER); |
28 | jScrollPane1.getViewport().add(jTextArea1, null ); |
29 | contentPane.add(jButton1, BorderLayout.SOUTH); |
30 | contentPane.add(jPanel1, BorderLayout.NORTH); |
31 | jPanel1.add(jLabel1, null ); |
32 | jPanel1.add(jTextField1, null ); |
33 | jPanel1.add(jLabel2, null ); |
34 | jPanel1.add(jTextField2, null ); |
35 | } |
01 | void jButton1_actionPerformed(ActionEvent e) { |
02 | String sour = this .jTextField1.getText(); |
03 | String dest = this .jTextField2.getText(); |
04 | String sourExt=sour.substring(sour.length()- 4 ,sour.length()).toLowerCase(); |
05 | String destExt=dest.substring(dest.length()- 4 ,dest.length()).toLowerCase(); |
06 | //如果源文件是zip 文件,则此次进行的操作是解压 |
07 | if (sourExt.equals( ".zip" )){ |
08 | //显示解压的信息 |
09 | this .jTextArea1.append( "\n" + "Unzip file " + " from " + this .jTextField1.getText()+ |
10 | " to " + this .jTextField2.getText()+ "\n" ); |
11 | //开始解压 |
12 | try { |
13 | unzip(); |
14 | } catch (Exception err){ |
15 | err.printStackTrace(); |
16 | } |
17 | } |
18 | //如果目标文件是zip 格式,则此次操作是压缩 |
19 | if (destExt.equals( ".zip" )){ |
20 | //显示压缩信息 |
21 | this .jTextArea1.append( "\n" + "Zip file " + this .jTextField1.getText()+ |
22 | " to " + this .jTextField2.getText()+ "\n" ); |
23 | //开始压缩 |
24 | try { |
25 | zip(); |
26 | } catch (Exception err){ |
27 | err.printStackTrace(); |
28 | } |
29 | } |
30 | } |
01 | void unzip() throws Exception{ |
02 | byte [] buffer = new byte [ 1024 ]; //设置缓冲区 |
03 | File file = new File( this .jTextField2.getText()); //以解压文件将放置的目录路径创建一个File 对象 |
04 | //如果目录不存在,创建目录 |
05 | if (!file.exists()) |
06 | file.mkdirs(); |
07 | ZipEntry ze = null ; |
08 | ZipFile zf = new ZipFile( new File( this .jTextField1.getText())); //创建ZipFile 对象 |
09 | //获得其中的ZipEntry 对象 |
10 | Enumeration enum = zf.entries(); |
11 | if ( enum .hasMoreElements()){ |
12 | ze = (ZipEntry) enum .nextElement(); |
13 | } |
14 | //以最终解压文件的路径创建一个File 对象 |
15 | file = new File( this .jTextField2.getText()+File.separator+ze.getName()); |
16 | //文件不存在,则新建 |
17 | if (!file.exists()){ |
18 | file.createNewFile(); |
19 | } |
20 | //链接各输入输出流 |
21 | InputStream is = zf.getInputStream(ze); |
22 | DataInputStream dis = new DataInputStream(is); |
23 | FileOutputStream fos = new FileOutputStream(file); |
24 | DataOutputStream dos = new DataOutputStream(fos); |
25 | this .jTextArea1.append( "Starting unzip ......\n" ); //显示信息,要开始解压 |
26 | //开始解压 |
27 | int bytes; |
28 | while ((bytes=dis.read(buffer, 0 ,buffer.length))!=- 1 ){ |
29 | dos.write(buffer, 0 ,bytes); |
30 | } |
31 | //关闭输入输出流 |
32 | dis.close(); |
33 | dos.close(); |
34 | //显示信息,解压成功 |
35 | this .jTextArea1.append( "\t" + "unzipped " +ze.getName()+ "\n" ); |
36 | this .jTextArea1.append( "Unzip complete.\n" ); |
37 | } |
view
source
print?
01 | void zip() throws Exception{ |
02 | byte [] buffer = new byte [ 1024 ]; //创建缓冲区 |
03 | //建立要压缩文件的输入流 |
04 | File file = new File( this .jTextField1.getText()); |
05 | FileInputStream fis = new FileInputStream(file); |
06 | DataInputStream dis = new DataInputStream(fis); |
07 | File zipfile = new File( this .jTextField2.getText()); //创建压缩文件的File 对象 |
08 | //如果压缩文件不存在,则判断压缩文件的上层目录是否存在,如不存在,新建各级目录,最后新建压缩文件。 |
09 | if (!zipfile.exists()){ |
10 | File zipdir = new File(zipfile.getParent()); |
11 | if (!zipdir.exists()){ |
12 | zipdir.mkdirs(); |
13 | } |
14 | zipfile.createNewFile(); |
15 | } |
16 | //建立压缩文件包中的压缩文件的输出流 |
17 | ZipEntry ze = new ZipEntry(file.getName()); |
18 | FileOutputStream fos = new FileOutputStream(zipfile); |
19 | ZipOutputStream zos = new ZipOutputStream(fos); |
20 | zos.setMethod(ZipOutputStream.DEFLATED); |
21 | zos.putNextEntry(ze); |
22 | DataOutputStream dos = new DataOutputStream(zos); |
23 | //显示信息,要开始压缩 |
24 | this .jTextArea1.append( "Starting zip ......\n" ); |
25 | //开始压缩 |
26 | int bytes; |
27 | while ((bytes=dis.read(buffer, 0 ,buffer.length))!=- 1 ){ |
28 | dos.write(buffer, 0 ,bytes); |
29 | } |
30 | //关闭输入输出流 |
31 | dis.close(); |
32 | dos.close(); |
33 | //显示压缩成功信息 |
34 | this .jTextArea1.append( "\t" + "Zipped" + this .jTextField1.getText()+ "\n" ); |
35 | this .jTextArea1.append( "Zip complete.\n" ); |
36 | } |
相关文章推荐
- Java 基于java.util.zip类压缩解压Zip文件
- Java 基于java.util.zip类压缩解压Zip文件
- Java 基于java.util.zip类压缩解压Zip文件
- Java 基于java.util.zip类压缩解压Zip文件
- Java压缩和解压文件工具类ZipUtil
- Java文件压缩与解压之java.util.zip的使用
- JAVA读取zip文件 JAVA读取压缩文件 解压zip里面的指定格式文件
- java.util.zip.Deflater 压缩 inflater解压 实例
- 使用java.util.zip实现zip压缩和解压
- (java 基础知识) Zip解压与压缩(java.util.zip)
- 使用java.util.zip压缩、解压文件
- java.util.zip压缩打包文件总结二: ZIP解压技术
- 使用java.util.zip实现zip压缩和解压
- java.util.zip 的解压和压缩文件夹
- java.util.zip包无法正常解压rar软件压缩的rar文件
- java实现zip压缩及解压
- 应用java.util.zip包现数据压缩与解压
- 用java中的java.util.zip包读取压缩文件
- bad3 JAVA实现实用的ZIP压缩与解压
- 使用java.util.zip对字符串进行压缩和解压缩