Java 解压,压缩 zip文件
项目中用到对文件解压,压缩。于是自己就编写了一段
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
public static void unZip(String src,String target) throws IOException{
ZipInputStream zipIn=null;
ZipFile zip=null;
try {
zipIn = new ZipInputStream(new FileInputStream(src));
ZipEntry in=null;
zip=new ZipFile(src);
while((in=zipIn.getNextEntry())!=null){
File file=new File(target+in.getName());
if(in.getName().endsWith("/")){
file.mkdirs();
}
else{
byte[] b=IOUtil.getByteByInputStream(zip.getInputStream(in));
if(!new File(file.getParent()).exists()){
new File(file.getParent()).mkdirs();
}
FileOutputStream fout=new FileOutputStream(file);
fout.write(b);
fout.close();
}
}
zip.close();
} finally{
if(zipIn!=null){
zipIn.close();
}
if(zip!=null){
zip.close();
}
}
}
public static void inZip(List<File> files,String basePath,String target) throws IOException{
List<File> cfiles=new ArrayList<File>();
for (File file : files){
cfiles.add(file);
}
for (File file : cfiles) {
if(file.isDirectory()){
IOUtil.getAllFiles(file.toString(), files);
}
}
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(target));
for (File file : files) {
System.out.println(file);
ZipEntry entry = null;
byte[] b = new byte[1024];
int len = 0;
if (file.isFile()) {
entry = new ZipEntry(file.toString().substring(basePath.length()));
zos.putNextEntry(entry);
InputStream is = new BufferedInputStream(new FileInputStream(file));
while ((len = is.read(b, 0, b.length)) != -1) {
zos.write(b, 0, len);
}
is.close();
}
else{
}
}
zos.close();
}
public static void main(String[] args) {
try {
List<File> files=new LinkedList<File>();
files.add(new File("D:/tmp"));
files.add(new File("D:/t2.jpg"));
inZip(files,"D:/","D:/1.zip");
unZip("D:/1.zip", "D:/tmp/");
} catch (IOException e) {
e.printStackTrace();
}
}
}
依赖的IOUtil
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class IOUtil {
public static final byte[] getByteByInputStream(InputStream in) {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tempByte = new byte[1024];
try {
int length = 0;
while ((length = in.read(tempByte)) != -1) {
bout.write(tempByte, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bout.toByteArray();
}
public static final String getStringInputStream(InputStream in) {
try {
return new String(getByteByInputStream(in),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static final void getAllFiles(String path, List<File> files) {
getAllFilesByProfix(path, null, files);
}
public static final void getAllFilesByProfix(String path, String suffix,
List<File> files) {
File file = new File(path);
if (file.isDirectory()) {
File[] fs = file.listFiles();
if (fs != null) {
for (File file2 : fs) {
if (file2.isDirectory()) {
getAllFilesByProfix(file2.getPath(), suffix, files);
} else {
if (suffix != null) {
if (file2.toString().endsWith(suffix)) {
files.add(file2);
}
} else {
files.add(file2);
}
}
}
}
} else {
if (suffix != null) {
if (file.toString().endsWith(suffix)) {
files.add(file);
}
} else {
files.add(file);
}
}
}
public static void moveOrCopy(String filer,String tag,boolean isMove)
{
System.out.println(filer);
File f=new File(filer);
if(f.isDirectory())
{
File fs[]=new File(filer).listFiles();
tag=tag+"/"+f.getName();
new File(tag).mkdirs();
for(File fl:fs)
{
if(fl.isDirectory())
{
moveOrCopy(fl.toString(),tag,isMove);
}
else
{
moveOrCopyFile(fl.toString(),tag+"/"+fl.getName(),isMove);
}
}
}
else{
moveOrCopyFile(f.toString(),tag+"/"+f.getName(),isMove);
}
}
public static void writeStrToFile(String str,File file){
writeBytesToFile(str.getBytes(), file);
}
public static void writeBytesToFile(byte[] bytes,File file){
try {
FileOutputStream out = new FileOutputStream(file);
out.write(bytes);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void moveOrCopyFile(String src, String tag, boolean isMove) {
try {
long s = System.currentTimeMillis();
File f = new File(src);
FileInputStream in = new FileInputStream(f);
new File(tag).getParentFile().mkdirs();
FileOutputStream out = new FileOutputStream(tag);
// 小于1M(大小根据自己的情况而定)的文件直接一次性写入。
byte[] b = new byte[1024];
int length = 0;
while ((length = in.read(b)) != -1) {
out.write(b, 0, length);
}
// 一定要记得关闭流额。 不然其他程序那个文件无法进行操作
in.close();
out.close();
System.out.println(System.currentTimeMillis() - s);
if (isMove) {
f.delete();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
理解了ZipEntry 对编写代码有一定帮助(与Map.Entry类似)。 其实就是说其中的文件的意思。
Reproduced please indicate the author and the source, and error a link to this page.
text link:
//xiaochun.zrlog.com/229.html