您的位置:首页 > 编程语言 > Java开发

Java文件的压缩和解压操作

2015-04-02 15:15 423 查看
最近在一本书上看到了java文件压缩和解压的知识,以前在做一个社交网站的时候就遇到了上传图片文件前需要压缩的情况,当时对于这块完全是一片茫然,所以就打算记录下来。**数据压缩**是通过数学运算将较大的尺寸的文件变为较小尺寸的文件的数字处理技术,常用于文件的存储和网络传输。压缩分为有损压缩和无损压缩,典型的有损文件的代表视频文件格式的mpeg、音频格式的mp3、和图像格式的jpg;无损格式的代表,比如常见的zip、rar等。
压缩的**原理**简述:文件类型中都包含了相当多的冗余的内容,他们会反复的列出一些相同的信息。文件压缩就是要消除这种情况。压缩文件的基本眼里就是查找文件内的重复字节,并建立一个相同字节的“词典”文件,并用一个代码表示。比如这句话:“Ask not what your country can do for you--ask what you can do for you country.(不要问国家为你做了些什么,而应该问自己能为国家做些什么。)”,这个句子就有一般是重复的,忽略大小写的话,ask、not、what、your、country、can、do、for、you这9个词几乎构成了这句话所需要的所有的东西。把这几个单词除not以外的作为字典(因为not没有重复),就可以把上面那句话存储为1 not 2 3 4 5 6 7 8--1 2 8 5 6 3 4。
下面用java代码实现一个简单的压缩和解压缩的程序:


压缩的程序代码(运行结果会在指定的文件夹下生成相关的zip文件):

package com.test.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
*
*
* @author mhc
* <em>java压缩的程序(Zip)</em>
*
*/
public class Zipper {

private String zipTarget;
private String zipSource;
public Zipper(String zipTarget,String zipSource){
this.zipTarget = zipTarget;
this.zipSource = zipSource;
}

public void compress(){
try {
FileOutputStream fout = new FileOutputStream(zipTarget);
/*压缩文件的输出流ZipOutputStream*/
ZipOutputStream zout = new ZipOutputStream(fout);
/*
*  Sets the compression level for subsequent(随后的) entries which are DEFLATED(缩小). The default
*  setting is DEFAULT_COMPRESSION.
Parameters:
level - the compression level (0-9)*/
zout.setLevel(9);
File file = new File(zipSource);
if(file.isDirectory()){//判断是否是目录
String[] fileList = file.list();
for(int i = 0;i<fileList.length;i++){
ZipEntry ze = new ZipEntry(fileList[i]);
System.out.println("正在压缩的文件 "+fileList[i]);
File f1  = new File(file+"\\"+fileList[i]);
if(f1.isDirectory()){
System.out.println("目录下不能有目录");
return;
}
FileInputStream fis = new FileInputStream(f1);

/* 这是putNextEntry的介绍
* Begins writing a new ZIP file entry and positions the stream to the
* start of the entry data. Closes the current entry if still active.
* The default compression method will be used if no compression method
*  was specified for the entry, and the current time will be used if the
*   entry has no set modification time.*/
zout.putNextEntry(ze);
/**
* 在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过
* putNextEntry 设置一个ZipEntry 即可。
*
* 相关的API可以参见博客http://blog.csdn.net/hanshileiai/article/details/6718375
*/
int c = -1;
while((c =fis.read())!=-1){
zout.write(c);
}
fis.close();//关闭输入流
}
}
zout.closeEntry();// 关闭输出流
zout.close();

} catch (Exception e) {
System.err.println(e.toString());
}
}

public static void main(String[] args) {
Zipper zipper = new Zipper("D:\\aa.zip", "D:/aa");/*‘\’反义符表示路径必须使用两次,'/'则只需要使用一次*/
zipper.compress();
}
}


解压缩(zip)文件的程序代码:

package com.test.zip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
*
* @author mhc
* <em>java的解压程序(Zip)</em>
*
*/
public class UnZipper {
String zipSource;//压缩的源文件的路径
String Dir;//设置解压的根目录
UnZipper(String zipFile,String Dir){
zipSource = zipFile;
this.Dir = Dir;
}

public void unCompress(){
try {
ZipFile zf = new ZipFile(zipSource);
/**
* Enumeration entries()获取压缩包内的各文件的入口列表,通过枚举获得入口文件
*
* 关于更详细的介绍可以参考博客:http://blog.csdn.net/zhiweianran/article/details/7672433
* 谢谢博主!
*/

// zf.entries方法Returns an enumeration of the ZIP file entries.
Enumeration es = zf.entries();
System.out.println("开始解压!");
System.out.println();
while(es.hasMoreElements()){
ZipEntry ze = (ZipEntry) es.nextElement();
System.out.println("当前解压的文件是:"+ze.getName());
if(ze.isDirectory()){// 如果当前的接口是目录的话
File ff = new File(Dir+"newZip",ze.getName());
ff.mkdirs();
}else{//非目录的情况,开始写文件
InputStream in = zf.getInputStream(ze);//获取输入流
File ff = new File(Dir+"newZip",ze.getName());
File fp = ff.getParentFile();
fp.mkdirs();
/*mkdirs可以创建多级的目录
* 而mkdir只能在已经存在的目录中创建目录
* */
FileOutputStream fout = new FileOutputStream(ff);
int c = -1;
byte[] b = new byte[1024];
while((c=in.read(b))!=-1){
fout.write(c);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static void main(String[] args){
UnZipper uz = new UnZipper("D:/aa.zip","D:/");
uz.unCompress();
}
}


压缩的文件格式还有好几种,使用的方式大概相同,在代码片段中的大神博客链接中有更仔细的讲解,谢谢该博主的分享!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: