该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术: MyEclipse java
作者:吴泳春
撰写时间:2019-6-20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ZIP压缩文件是一种非常常见的文件压缩形式,压缩后的文件可以节省存储空间,在java的内置类中提供了相关类,实现的方式也比较为简单。使用java.util.zip包中的ZipOutputStream与ZipInputStream类来实现文件的压缩/解压缩。如果要从ZIP压缩管理文件内读取某个文件,要首先找到对应文件的目录进入点,才能读取这个文件的内容。
ZipOutputStream对象,可以文件压缩为.zip文件。ZipOutputStream类构造方法如下
ZipOutputStream(OutputStreamout)
ZipOutputStream类常用方法
putNextEntry(ZipEntryz):开始写一个新的ZipEntry,将流的位置移到此entry所指的开头
write(byte[]by,intoff,int length) 将字节数组写入当前ZIP条目数据
setComment(Stringcomment) 设置此ZIP文件的注释文字
示例:将指定文件下的文件压缩
html代码(form表单,获取压缩文件路径,使用POST方式提交到Servlet层)
压缩
Servlet代码 下面代码主要是获取到文件夹路径,然后调用zipFile方法来实现压缩文件夹中的所有子文件夹。
publicvoid compressFile(HttpServletRequest request, HttpServletResponse res) {
try {
//省略了设置编码格式的代码
String filePath = request.getParameter("filePath"); //获取源文件夹路径
FileUtil fileUtil = new FileUtil();
if (filePath != null && !filePath.equals("")) {
File folder = new File(filePath);
File zipFile = new File(folder.getParent(), folder.getName() + ".zip");
zipFile.createNewFile();
zipFile(filePath, zipFile, folder.getParent());
res.getWriter().print("压缩成功");
}
else {
res.getWriter().print("NoFilePathFound");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
zipFile方法代码如下 zipFile方法参数sourceFile表示要压缩的文件夹路径,targetZipFile为压缩后的文件路径,base为压缩文件夹的基本路径。先调用getFileList()
方法获取指定目录下的所有文件路径,然后根据targetZipFile创建文件输出流对象,创建Zip输出流对象,参数为文件输出流对象,创建字节数组,在遍历要所有要压缩的文件路径时使用压缩文件的相对路径来创建ZipEntry对象后,再将数据写入输出流中。(用完流记得关闭)
public void zipFile(String sourceFile, FiletargetZipFile, String base) throws IOException {
getFileList(sourceFile);
//创建文件输出流对象并传入压缩后的位置
FileOutputStream fileOutStream = new FileOutputStream(targetZipFile);
//用输出流对象创建Zip输出流对象
ZipOutputStream zipOutStream = new ZipOutputStream(fileOutStream);
byte[] by = newbyte[1024];
for (String filePath : filePaths) {
FilecurFile = new File(filePath);
//使用相对路径来创建ZipEntry对象
ZipEntry entry = new ZipEntry(filePath.substring(base.length()+1, filePath.length()));
FileInputStream fileInStream = new FileInputStream(curFile);
zipOutStream.putNextEntry(entry);
intcount = 0;
while ((count = fileInStream.read(by)) != -1) {
//将数据写入到Zip输出流中
zipOutStream.write(by, 0, count);
}
zipOutStream.closeEntry();//关闭ZipEntry对象
fileInStream.close();
}
zipOutStream.close();//释放
fileOutStream.close();
}
getFileList()方法:根据传过来的文件路径创建File对象,获取文件下的文件数组,循坏遍历判断文件数组是否当前文件是否是一个目录,如果是就继续调用该方法,不是将该文件路径添加到集合中
publicvoid getFiles(Stringpath) {
File dir = new File(path);
File files[] = dir.listFiles();
for (File file:files ) {
if (file.isDirectory()) //判断是否是目录
getFiles(file.getAbsolutePath());
else {
filePaths.add(file.getAbsolutePath());
}
}
}
效果