一 概述1.目录进入点目录进入点是文件在压缩文件中的映射,代表压缩文件。压缩文件时,创建目录进入点,将文件写入该目录进入点。解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件。
如果目录进入点是一个文件夹,在命名时必须以路径分隔符结尾,在window操作系统中名称分隔符为“/”。
2.文件的自动创建无论是调用createnewfile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则文件无法创建。
3.目录的创建mkdirs():创建多级目录。
mkdir():创建一级目录,如果父路径不存在,创建失败。
二 压缩1.创建目录进入点首先为文件或者文件夹创建目录进入点,目录进入点的名称为当前文件相对于压缩文件的路径,文件夹的目录进入点名称必须以名称分隔符结尾,以区别于文件。
zipentry entry = new zipentry(压缩文件夹名称 + file.separator+文件或文件夹路径);
2.写入目录进入点使用zipoutputstream输出流将文件写入对应目录进入点中,写入完成,关闭目录进入点。
3.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {/** * 压缩一个文件夹
*
* @throws ioexception */public void zipdirectory(string path) throws ioexception {
file file = new file(path);
string parent = file.getparent();
file zipfile = new file(parent, file.getname() + .zip);
zipoutputstream zos = new zipoutputstream(new fileoutputstream(zipfile));
zip(zos, file, file.getname());
zos.flush();
zos.close();
}/** *
* @param zos
* 压缩输出流
* @param file
* 当前需要压缩的文件
* @param path
* 当前文件相对于压缩文件夹的路径
* @throws ioexception */private void zip(zipoutputstream zos, file file, string path) throws ioexception {// 首先判断是文件,还是文件夹,文件直接写入目录进入点,文件夹则遍历if (file.isdirectory()) {
zipentry entry = new zipentry(path + file.separator);// 文件夹的目录进入点必须以名称分隔符结尾 zos.putnextentry(entry);
file[] files = file.listfiles();for (file x : files) {
zip(zos, x, path + file.separator + x.getname());
}
} else {
fileinputstream fis = new fileinputstream(file);// 目录进入点的名字是文件在压缩文件中的路径zipentry entry = new zipentry(path);
zos.putnextentry(entry);// 建立一个目录进入点int len = 0;byte[] buf = new byte[1024];while ((len = fis.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.flush();
fis.close();
zos.closeentry();// 关闭当前目录进入点,将输入流移动下一个目录进入点 }
}}
三 解压文件1.基本思路解压文件时,先获取压缩文件中的目录进入点,根据该目录进入点创建文件对象,将目录进入点的内容写入硬盘文件中。
2.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {private string basepath;/** * 解压文件
*
* @param unzip
* @throws ioexception */public void unzip(string unzip) throws ioexception {
file file = new file(unzip);
basepath = file.getparent();
fileinputstream fis = new fileinputstream(file);
zipinputstream zis = new zipinputstream(fis);
unzip(zis);
}private void unzip(zipinputstream zis) throws ioexception {
zipentry entry = zis.getnextentry();if (entry != null) {
file file = new file(basepath + file.separator + entry.getname());if (file.isdirectory()) {// 可能存在空文件夹if (!file.exists())
file.mkdirs();
unzip(zis);
} else {
file parentfile = file.getparentfile();if (parentfile != null && !parentfile.exists())
parentfile.mkdirs();
fileoutputstream fos = new fileoutputstream(file);// 输出流创建文件时必须保证父路径存在int len = 0;byte[] buf = new byte[1024];while ((len = zis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
zis.closeentry();
unzip(zis);
}
}
}
}
程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression)
大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
package com.han;
import java.io.*;
import java.util.zip.*;
/**
* 程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression)
* <p>
* 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
* <p>
* 在本段代码中,实现的是压缩部分;解压部分见本包中decompression部分。
*
* @author han
*
*/
public class myzipcompressing {
private int k = 1; // 定义递归次数变量
public myzipcompressing() {
// todo auto-generated constructor stub
}
/**
* @param args
*/
public static void main(string[] args) {
// todo auto-generated method stub
myzipcompressing book = new myzipcompressing();
try {
book.zip("c:\\users\\gaowen\\desktop\\ziptestcompressing.zip",
new file("c:\\users\\gaowen\\documents\\tencent files"));
} catch (exception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
private void zip(string zipfilename, file inputfile) throws exception {
system.out.println("压缩中...");
zipoutputstream out = new zipoutputstream(new fileoutputstream(
zipfilename));
bufferedoutputstream bo = new bufferedoutputstream(out);
zip(out, inputfile, inputfile.getname(), bo);
bo.close();
out.close(); // 输出流关闭
system.out.println("压缩完成");
}
private void zip(zipoutputstream out, file f, string base,
bufferedoutputstream bo) throws exception { // 方法重载
if (f.isdirectory()) {
file[] fl = f.listfiles();
if (fl.length == 0) {
out.putnextentry(new zipentry(base + "/")); // 创建zip压缩进入点base
system.out.println(base + "/");
}
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + "/" + fl[i].getname(), bo); // 递归遍历子文件夹
}
system.out.println("第" + k + "次递归");
k++;
} else {
out.putnextentry(new zipentry(base)); // 创建zip压缩进入点base
system.out.println(base);
fileinputstream in = new fileinputstream(f);
bufferedinputstream bi = new bufferedinputstream(in);
int b;
while ((b = bi.read()) != -1) {
bo.write(b); // 将字节流写入当前zip目录
}
bi.close();
in.close(); // 输入流关闭
}
}
}
package com.han;
import java.io.*;
import java.util.zip.*;
/**
* 程序实现了zip压缩。共分为2部分 :
* 压缩(compression)与解压(decompression)
* <p>
* 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。
* 需在代码中自定义源输入路径和目标输出路径。
* <p>
* 在本段代码中,实现的是解压部分;压缩部分见本包中compression部分。
* @author han
*
*/
public class copyofmyzipdecompressing {
public static void main(string[] args) {
// todo auto-generated method stub
long starttime=system.currenttimemillis();
try {
zipinputstream zin=new zipinputstream(new fileinputstream(
"c:\\users\\han\\desktop\\stock\\spectrecompressed.zip"));//输入源zip路径
bufferedinputstream bin=new bufferedinputstream(zin);
string parent="c:\\users\\han\\desktop"; //输出路径(文件夹目录)
file fout=null;
zipentry entry;
try {
while((entry = zin.getnextentry())!=null && !entry.isdirectory()){
fout=new file(parent,entry.getname());
if(!fout.exists()){
(new file(fout.getparent())).mkdirs();
}
fileoutputstream out=new fileoutputstream(fout);
bufferedoutputstream bout=new bufferedoutputstream(out);
int b;
while((b=bin.read())!=-1){
bout.write(b);
}
bout.close();
out.close();
system.out.println(fout+"解压成功");
}
bin.close();
zin.close();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
long endtime=system.currenttimemillis();
system.out.println("耗费时间: "+(endtime-starttime)+" ms");
}
}
以上就是java对文件的压缩与解压的详细内容。