package com.newio;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.*;
/*需求分析:本节需要java三个压缩技术之--ZipOutputStream
* public ZipOutputStream(OutputStream out):创建新的zip输出流
* */
class ZipTool{
/**
* 1.压缩一个文件:
* @author ManagementAndJava
* @param fileName:被压缩的文件名
* @param zipFileName:压缩完成的文件名
* @throws IOException
*
*/
public static void compressFile(String fileName,String zipFileName) throws IOException{
//1.建立要被压缩的文件对象;
File file = new File(fileName);
//2.建立输出的压缩文件对象
File zipFile = new File(zipFileName);
//3.对压缩文件输入流进行封装
ZipOutputStream zos = new ZipOutputStream(new CheckedOutputStream(
new FileOutputStream(zipFile),new Adler32()));
BufferedOutputStream bos = new BufferedOutputStream(zos);
//4.设置压缩文件中的每个条目
zos.putNextEntry(new ZipEntry(file.getName()));
//5.对被压缩的文件输出流进行封装
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
//6.从输出流读出数据写入输入流中
int len;
byte[] bytes = new byte[1024];
while((len = bis.read(bytes))!=-1){
bos.write(bytes, 0, len);
bos.flush();
}
//7.关闭条目和流
zos.closeEntry();
bis.close();
zos.close();
}
/**
* 2.压缩一个文件夹:
* @author ManagementAndJava
* @param fileName:被压缩的文件名
* @param zipFileName:压缩完成的文件名
* @throws IOException
*
*/
public static void compressFiles(String fileName,String zipFileName) throws IOException{
//1.建立被压缩文件对象
File file = new File(fileName);
//2.建立输出的压缩文件对象
File zipFile = new File(zipFileName);
//3.对压缩文件输入流进行封装
ZipOutputStream zos = new ZipOutputStream(new CheckedOutputStream(
new FileOutputStream(zipFile),new Adler32()));
BufferedOutputStream bos = new BufferedOutputStream(zos);
if(file.isDirectory()){
int len;
byte[] bytes = new byte[1024];
BufferedInputStream bis ;
File[] files = file.listFiles();
for(int i=0;i<files.length;i++){
//4.对被压缩的文件输出流进行封装
bis = new BufferedInputStream(new FileInputStream(files[i]));
//5.建立压缩文件中的条目
zos.putNextEntry(new ZipEntry(files[i].getName()));
//6.从输出流读出数据写入输入流中
while((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
bis.close();
}
zos.closeEntry();
}
bos.close();
}
/**
* 3.压缩一个目录:其中可以含有多个文件和文件夹;
* @author ManagementAndJava
* @param fileName:被压缩的文件名
* @param zipFileName:压缩完成的文件名
* @throws IOException
*
*/
public static void compressDir(String fileName,String zipFileName) throws IOException{
//1.建立被压缩目录对象
File inFile = new File(fileName);
//2.建立输入的压缩文件对象
File zipFile = new File(zipFileName);
//3.对压缩问价输入流进行封装
ZipOutputStream zos = new ZipOutputStream(
new CheckedOutputStream(
new FileOutputStream(zipFile),new Adler32()));
BufferedOutputStream bos = new BufferedOutputStream(zos);
//定义一个方法内部来来拿到所有的文件名;
class ListDir{
private ArrayList<String> list = new ArrayList<String>();
//递归调用来遍历所有的文件名称;
public ArrayList<String> listDir(File dir){
if(dir.isDirectory()){
File[] files = dir.listFiles();
for(File f:files){
listDir(f);
}
}
else{
String dirName = dir.getAbsolutePath();
list.add(dirName);
}
return list;
}
}
//4.拿到文件目录下的所有文件;
ArrayList<String> list = new ListDir().listDir(inFile);
int len;
BufferedInputStream bis;
for(int i=0;i<list.size();i++){
bis = new BufferedInputStream(new FileInputStream(list.get(i)));
zos.putNextEntry(new ZipEntry(list.get(i)));
byte[] bytes = new byte[512];
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
bis.close();
}
bos.close();
}
}
public class ZipDemo {
public static void main(String[] args) throws IOException {
//调用方法1;压缩一个文件
ZipTool.compressFile("f:\\javatest\\1.java", "f:\\file.zip");
//调用方法2:压缩一个文件夹
ZipTool.compressFiles("f:\\javatest\\text", "f:\\files.zip");
//调用方法3:压缩一个目录里面有多个文件和文件夹
ZipTool.compressDir("f:\\javatest", "f:\\files.zip");
System.out.println("zip succeed");
}
}
JAVA压缩文件之-ZipOutputStream
最新推荐文章于 2022-05-14 12:48:06 发布