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类似)。 其实就是说其中的文件的意思。
转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/229.html