//这个小软件有两个类,实现了500MB文件压缩,太大的话容易出问题,还没解决 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import javax.xml.parsers.FactoryConfigurationError; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.JButton; import javax.swing.JFileChooser; /** * 主界面类 * @author yan * */ public class ZipUI extends JFrame implements ActionListener{ public JPanel contentPane; public static JTextField textField; public static JTextField textField_1; public static JButton bopen; public static JButton bys; public static JButton bqx ; public static JButton bjy; private APIzip az; private String pathopen; private JLabel lblNewLabel_3; private JTextPane area; public static void main(String[] args) { ZipUI frame = new ZipUI(); frame.setVisible(true); } /** * 创建界面 */ public ZipUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(400, 200, 450, 320); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel lblNewLabel = new JLabel("需要压缩或解压文件.."); lblNewLabel.setBounds(54, 10, 129, 29); contentPane.add(lblNewLabel); textField = new JTextField(); textField.setBounds(54, 49, 252, 21); contentPane.add(textField); textField.setColumns(10); bopen = new JButton("打开文件"); bopen.setBounds(316, 49, 93, 23); bopen.addActionListener(this); contentPane.add(bopen); bys = new JButton("压缩文件"); bys.setBounds(54,90, 93, 23); bys.addActionListener(this); contentPane.add(bys); bjy = new JButton("解压文件"); bjy.setBounds(170, 90, 93, 23); bjy.addActionListener(this); contentPane.add(bjy); bqx = new JButton(" 取 消"); bqx.setBounds(290, 90, 120, 23); bqx.addActionListener(this); contentPane.add(bqx); JLabel lblNewLabel_2 = new JLabel("详细信息...."); lblNewLabel_2.setBounds(54,120, 129, 30); contentPane.add(lblNewLabel_2); area = new JTextPane(); JScrollPane jsp = new JScrollPane(area); jsp.setBounds(54,150,350,100); contentPane.add(jsp); lblNewLabel_3 = new JLabel(); lblNewLabel_3.setBounds(290,245, 200,40); contentPane.add(lblNewLabel_3); az=new APIzip(area); } public void actionPerformed(ActionEvent e) { JFileChooser jfc=new JFileChooser(); //设置要显示的文件类型(括号里面的值) jfc.setFileSelectionMode(jfc.FILES_AND_DIRECTORIES);//设置文件 if (e.getSource() ==bopen) { jfc.showOpenDialog(null); pathopen=jfc.getSelectedFile().toString();//本来得到一个文件类型,但是需要在text上面显示 textField.setText(pathopen); } //压缩文件 if(e.getSource()==bys){ if(pathopen.endsWith(".zip")){ JOptionPane.showMessageDialog(null, "已经是压缩文件,不能重复压缩!"); }else{ pathopen =textField.getText(); double t1=System.currentTimeMillis(); az.CreateZip(pathopen); lblNewLabel_3.setText("压缩耗费时间... "+(System.currentTimeMillis()-t1)/1000); } } //解压文件 if(e.getSource()==bjy){ if(pathopen.endsWith(".zip")){ pathopen =textField.getText(); double t1=System.currentTimeMillis(); az.jieya(pathopen); lblNewLabel_3.setText("解压耗费时间... "+(System.currentTimeMillis()-t1)/1000); }else{ JOptionPane.showMessageDialog(null, "不是压缩文件,无法解压!"); } } if(e.getSource()==bqx){ //结束(取消) System.exit(0); } } }
//第二个类,实现解压和压缩,用到了递归遍历文件
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import javax.swing.JLabel; import javax.swing.JTextPane; /** * 实现了压缩和解压方法 * @author yan * */ public class APIzip { private JTextPane area; /** * * @param area 由界面的JTextPane 将文件详细信息写入 */ public APIzip(JTextPane area) { this.area=area; } /** * 压缩方法 * @param path1 需要压缩的文件的名称 * 1.利用递归得到子文件 * 2.创建ZipOutputStream * 3.遍历得到每一个文件的输入流 * 4.开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处 * 5.读与写 */ public void CreateZip(String path1){ try { String path2=path1+".zip";//压缩完后的文件路径直接在后面加.zip List<File> list=getFiles(path1); //1.利用递归得到子文件 ZipOutputStream out =new ZipOutputStream(new FileOutputStream(new File(path2)));//2.创建ZipOutputStream for(File f: list){ InputStream in=new FileInputStream(f);//3.遍历得到每一个文件的输入流,读取数据 String name=getRelName(path1,f);// // 4.开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处 ZipEntry en=new ZipEntry(new File(path1).getName()+"/"+name); en.setSize(f.length()); /*** * 开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。 * 如果仍处于活动状态,则关闭当前条目。如果没有为条目指定压缩方法, * 则使用默认的压缩方法;如果没有为条目设置修改时间,则使用当前时间。 */ out.putNextEntry(en); int size=100; long length=f.length(); //粗略计算文件大小,来设置数组大小,利于快速传送 if(length>10000000){ size=1000000; }else if(length>1000000){ size=100000; }else if(length>100000){ size=10000; }else if(length>10000){ size=1000; } //5.边读与边写 int len=0; byte[] b=new byte[size]; while((len=in.read(b))!=-1){ out.write(b,0,size); } in.close(); } out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取文件的相对路径 * @param path1 需要压缩的文件路径 * @param f 需要压缩的文件子文件 * @return 字符串(路径) */ private String getRelName(String path1, File f) { String a=f.getAbsolutePath().replace(path1+"\\",""); a=a.replace("\\", "/"); System.out.println(path1+"---"+a); String text=area.getText(); area.setText(text+path1+"---"+a+"\r\n"); if(text.length()>1000){ area.setText(a+"\r\n"); } return a; } /**利用递归得到子文件 * 获取路径下所有文件,包括文件夹下的 * @param path1 * @return 文件夹里面的子文件 */ private List<File> getFiles(String sou) { List<File> list=new ArrayList<File>(); File f=new File(sou); File files[]=f.listFiles(); for(File file: files){ if(file.isFile()){ list.add(file); }else{ list.addAll(getFiles(file.getPath())); } } return list; } /** * 解压 * @param path2 需要解压的文件路径 * */ public void jieya(String path2){ try { //设置文件名称 int i=path2.indexOf(":"); String s=path2.substring(0,i); String path3=s+":\\"; //创建压缩文件 ZipFile zf=new ZipFile(new File(path2)); InputStream is; Enumeration en=zf.entries();//返回 ZIP 文件条目的枚举。 while(en.hasMoreElements()){ ZipEntry zn=(ZipEntry) en.nextElement();//遍历ZIP文件条目 if(!zn.isDirectory()){ is=zf.getInputStream(zn);//得到输入流 File f=new File (path3+zn.getName()); // 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 File file=f.getParentFile(); // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录 file.mkdirs(); FileOutputStream fos=new FileOutputStream(path3+zn.getName()); int len; byte b[] =new byte[1024]; while((len=is.read(b))!=-1){ fos.write(b,0,len); } } } } catch (Exception e) { e.printStackTrace(); } } }
//希望有更好的办法的大神来指教!
相关推荐
在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...
总的来说,使用Java的`ZipOutputStream`进行文件压缩时,必须注意文件名和路径的正确编码,以避免乱码问题。通过使用合适的编码方式(如UTF-8)并在`ZipOutputStream`构造函数中明确指定,可以确保在跨平台操作时...
以上就是关于Zip文件压缩和解压的基本介绍,无论是通过图形界面工具还是编程实现,都能有效地管理和处理Zip文件。在实际应用中,我们还可以根据需求选择合适的压缩算法、设置密码保护、添加注释等功能,提高文件管理...
通过对`ZipOutputStream`、`ZipEntry`等类的应用,以及递归算法的设计,我们可以轻松地实现对文件的压缩与解压操作。此外,通过合理的资源管理,我们还能确保程序的稳定性和高效性。这些技术点不仅适用于本示例中的...
在本文中,我们将使用SharpZipLib库来实现文件的压缩和解压。 SharpZipLib简介 SharpZipLib是一个开源的压缩库,它提供了压缩和解压的功能,支持多种压缩格式,包括Zip、GZip、BZip2等。 SharpZipLib库是基于...
这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...
基于GUI用IO流中的ZipOutputStream ,ZipInputStream实现文件的解压与压缩, 如文件解压函数如下 private void unZip(String zipFileName, String outputDirectory)throws Exception { InputStream in=null; ...
对于ZIP格式,我们主要使用`ZipOutputStream`来创建ZIP文件,`ZipFile`和`ZipInputStream`来读取和解压缩ZIP文件。对于GZIP格式,我们使用`GZIPOutputStream`来压缩数据,`GZIPInputStream`来解压缩。 1. ZIP压缩:...
本文将深入探讨如何使用Java实现ZIP文件的压缩与解压,重点讲解核心API,如`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`。 首先,我们来了解一下ZIP文件格式。ZIP是一种用于存储多个文件到一个单一...
### Java算法:实现压缩及解压缩 #### 一、压缩功能实现 在Java中实现文件压缩功能主要依赖于`java.util.zip`包中的类。以下是对压缩代码的详细解析: ##### 1. 导入所需类库 ```java import java.io....
在Java编程语言中,`zip`...通过`ZipFile`、`ZipOutputStream`和`ZipEntry`,我们可以方便地完成文件和目录的压缩与解压缩任务。在实际应用中,理解这些类的用法和交互对于编写高效、可靠的压缩/解压缩程序至关重要。
本项目就是针对这一需求,提供了简洁易懂的C#代码实现,使得开发者能够轻松地在Windows桌面应用中实现文件夹的压缩与解压缩。 在C#中,我们可以利用第三方库如SharpZipLib或System.IO.Compression命名空间来完成这...
本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关知识点。 首先,我们来看ZIP文件格式。ZIP是一种广泛使用的文件压缩格式,其在Java中的处理主要通过`java.util.zip`包。这个包提供了多个类...
在博客中提到的`SoftwareUp.java`文件可能是一个具体的实现,它结合了上述的FTP操作和文件压缩解压功能。如果你想要进一步了解这个文件的内容,需要查看实际的代码。 总结来说,Java中FTP文件上传和下载主要依赖于...
例如,在Java中,我们可以利用java.util.zip包中的ZipOutputStream类来实现文件的压缩。以下是一个简单的Java代码示例,展示了如何将多个文件压缩到一个Zip档案中: ```java import java.io.*; import java.util....
本文将深入探讨Android中如何实现文件的压缩和解压,并提供相关的编程知识点。 1. **ZIP文件格式** ZIP是一种广泛使用的文件压缩格式,它可以将多个文件或目录打包成一个单一的文件,方便存储和传输。ZIP文件内部...
这个包提供了多种类和接口,如`ZipOutputStream`、`ZipEntry`等,可以非常方便地实现压缩功能。 #### 文件压缩示例 下面是一个简单的文件压缩示例: ```java import java.io.*; import java.util.zip.*; public ...
- **压缩文件和目录**:你可以通过创建一个`ZipFile`对象,并调用`addFiles()`或`addFolder()`方法来将单个文件或整个目录添加到Zip文件中。 - **解压缩文件**:使用`unzip()`方法可以解压缩整个Zip文件,或者通过...
以上代码示例展示了如何使用Java标准库实现文件的压缩、上传和解压功能。这些方法可以作为基本模板,在实际项目中进行扩展和优化。例如,可以通过增加多线程支持来提高文件压缩或解压的速度,或者通过更精细的错误...
### JAVA解压和压缩详解 #### 一、概述 在软件开发过程中,文件的压缩与解压是一项常用的功能。尤其在处理大量数据时,通过压缩技术可以有效减少存储空间的需求及传输时间。Java作为一种广泛使用的编程语言,提供...