1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 使用java.util.zip包实现根据文件目录控制文件的压缩与解压

使用java.util.zip包实现根据文件目录控制文件的压缩与解压

时间:2018-11-20 14:51:16

相关推荐

使用java.util.zip包实现根据文件目录控制文件的压缩与解压

根据文件目录实现文件的压缩与解压

import java.io.BufferedInputStream;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.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;public class ZipFile {public static void main(String[] args) {//压缩测试//int count = doZip("D:\\Personality\\pdf\\zipTest", "myZip.zip");//解压测试int count = unzip("D:\\Personality\\pdf\\zipTest", "myZip.zip");System.out.println(count);}/** 缓冲器大小 */private static final int BUFFER = 1024;/*** decompression* @param srcPath待解压文件路径* @param zipFileName带解压文件名称* @return解压文件个数*/public static int unzip( String srcPath,String zipFileName) {ZipInputStream zipInputStream = null;//ZIP文件入口ZipEntry zipEntry = null;//缓冲区byte[] buffer = new byte[BUFFER];// 本次读出来的长度int readLength = 0;//解压文件个数int count = 0;try {zipInputStream = new ZipInputStream(new FileInputStream(srcPath+"//"+zipFileName));while ((zipEntry = zipInputStream.getNextEntry()) != null) {// 若是ZIP条目目录,则需创建这个目录if (zipEntry.isDirectory()) {File dir = new File(srcPath + "/" + zipEntry.getName());if (!dir.exists()) {dir.mkdirs();continue;}}// 若是文件,则需创建该文件File file = createFile(srcPath, zipEntry.getName());count++;OutputStream outputStream = new FileOutputStream(file);while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {outputStream.write(buffer, 0, readLength);}outputStream.close();}} catch (FileNotFoundException e) {e.printStackTrace();return -1;} catch (IOException e) {e.printStackTrace();return -2;} finally {//关闭流try {if (zipInputStream != null)zipInputStream.close();} catch (IOException e) {e.printStackTrace();return -2;}}return count;}/*** compression* @param srcPath待压缩文件目录* @param zipFileName 压缩后文件名称* @return 压缩文件个数*/public static int doZip(String srcPath, String zipFileName) {File srcFile = new File(srcPath);//通过路径获取文件集合List <File> fileList = getAllFiles(srcFile);//缓冲区byte[] buffer = new byte[BUFFER];//ZIP文件入口ZipEntry zipEntry = null;//本次读取长度int readLength = 0;ZipOutputStream zipOutputStream = null;//压缩后文件的名称String newZipFileName;//压缩文件总个数int count = 0;if(zipFileName==null||zipFileName.length()==0) {newZipFileName= srcPath+"newZip.zip";}else {newZipFileName = srcPath+"\\"+zipFileName;}try {zipOutputStream = new ZipOutputStream(new FileOutputStream(newZipFileName));for (File file : fileList) {// 若是文件,则压缩这个文件if (file.isFile()) {count++;zipEntry = new ZipEntry(getRelativePath(srcPath, file));zipEntry.setSize(file.length());zipEntry.setTime(file.lastModified());zipOutputStream.putNextEntry(zipEntry);InputStream inputStream = new BufferedInputStream(new FileInputStream(file));while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {zipOutputStream.write(buffer, 0, readLength);}inputStream.close();} else {zipEntry = new ZipEntry(getRelativePath(srcPath, file) + "/");zipOutputStream.putNextEntry(zipEntry);}}} catch (FileNotFoundException e) {e.printStackTrace();return -1;} catch (IOException e) {e.printStackTrace();return -2;} finally {try {if (zipOutputStream != null)zipOutputStream.close();} catch (IOException e) {e.printStackTrace();return -2;}}return count;}/*** get file list from srcFile* @param srcFile 文件路径* @return 对文件路径下的所有文件集合*/private static List<File> getAllFiles(File srcFile) {List<File> fileList = new ArrayList<File>();File[] tmp = srcFile.listFiles();for (int i = 0; i < tmp.length; i++) {if (tmp[i].isFile()) {fileList.add(tmp[i]);}if (tmp[i].isDirectory()) {// 若不是空目录,则递归添加其下的目录和文件if (tmp[i].listFiles().length != 0) {fileList.addAll(getAllFiles(tmp[i]));}// 若是空目录,则添加这个目录到fileListelse {fileList.add(tmp[i]);}}}return fileList;}private static String getRelativePath(String dirPath, File file) {File dir = new File(dirPath);String relativePath = file.getName();while (true) {file = file.getParentFile();if (file == null) {break;}if (file.equals(dir)) {break;} else {relativePath = file.getName() + "/" + relativePath;}}return relativePath;}private static File createFile(String srcPath, String fileName){// 将文件名的各级目录分解String[] dirs = fileName.split("/");File file = new File(srcPath);// 文件有上级目录if (dirs.length > 1) {for (int i = 0; i < dirs.length - 1; i++) {// 依次创建文件对象知道文件的上一级目录file = new File(file, dirs[i]);}if (!file.exists()) {// 文件对应目录若不存在,则创建file.mkdirs();}// 创建文件file = new File(file, dirs[dirs.length - 1]);return file;} else {if (!file.exists()) {// 若目标路径的目录不存在,则创建file.mkdirs();}// 创建文件file = new File(file, dirs[0]);return file;}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。