教你ZIP文件如何解压读取、压缩下载
1.zip文件解压读取
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class FilesUtil {
/**
* 根据url获取文件
* @param url 路径
* @return 文件流
*/
public static byte[] getFileStream(String url){
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取文件数据
byte[] btImg = readInputStream(inStream);//得到文件的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
/**
* 下载文件到本地
* @param url 文件全路径+文件名
* @param localUrl 下载到本地的路径,例:windows:D://、linux:/home/server/img/
*/
public static String downloadFileToLocal(String url,String localUrl){
// 将网络文件下载本地
try{
byte[] data = FilesUtil.getFileStream(url);
String substring = url.substring(url.lastIndexOf("/") + 1);
String name = localUrl + substring;
//创建一个文件对象
File file = new File(name);
//创建输出流
FileOutputStream outStream = new FileOutputStream(file);
//写入数据
outStream.write(data);
//关闭输出流,释放资源
outStream.close();
return name;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 解压缩(ZIP)文件
* @param inputFile
* @throws Exception
*/
public static void zipUncompress(String inputFile) throws Exception {
try{
File srcFile = new File(inputFile);
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new Exception(srcFile.getPath() + "所指文件不存在");
}
String destDirPath = inputFile.replace(".zip", "");
//创建压缩文件对象
ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"));
//开始解压
Enumeration<?> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
srcFile.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDirPath + "/" + entry.getName());
// 保证这个文件的父文件夹必须要存在
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 读取本地文件夹中的文件
* @param inputFile
* @return
* @throws Exception
*/
public static List<MultipartFile> readFiles(String inputFile) {
List<MultipartFile> multipartFiles = new ArrayList<>();
File srcFile = new File(inputFile);
if (srcFile.isDirectory()) {
File next[] = srcFile.listFiles();
for (int i = 0; i < next.length; i++) {
File file = next[i];
MultipartFile multipartFile = fileToMultipartFile(file);
multipartFiles.add(multipartFile);
}
}
return multipartFiles;
}
/**
* 文件对象转MultipartFile对象
* @param file 文件
* @return MultipartFile对象
*/
public static MultipartFile fileToMultipartFile(File file) {
FileItem fileItem = createFileItem(file);
return new CommonsMultipartFile(fileItem);
}
/**
* 根据File对象创建FileItem对象
* @param file File
* @return FileItem对象
*/
public static FileItem createFileItem(File file) {
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem("textField", "text/plain", true, file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return item;
}
}
2.压缩下载
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class FilesUtil {
/**
* 图片打包下载
*/
public static void downloadPictureList(List<String> urls,HttpServletResponse response) {
String DOMAIN = "";
List<String> fileNameList = new ArrayList<>();
for (int i = 0; i < urls.size(); i++) {
// 获取文件名
fileNameList.add(StringUtils.substringAfterLast(urls.get(i), "/"));
// 拼接完整图片路径
urls.set(i, DOMAIN + urls.get(i));
}
// 获取当前类的所在项目路径
File directory = new File("");
String courseFile;
String srcPath;
File srcFile = null;
// 要打包的文件列表
List<File> fileList = new ArrayList<>();
ZipOutputStream zos = null;
OutputStream out = null;
try {
courseFile = directory.getCanonicalPath();
// 下载文件
for (int i = 0; i < urls.size(); i++) {
String fileName = "\\" + fileNameList.get(i);
downloadHttpUrl(urls.get(i), courseFile, fileName);
srcPath = courseFile + fileName;
srcFile = new File(srcPath);
fileList.add(srcFile);
}
long start = System.currentTimeMillis();
response.setContentType("application/x-zip-compressed");
response.setHeader("Content-disposition", "attachment;filename=" + "testtesttest" + ".zip");
out = response.getOutputStream();
zos = new ZipOutputStream(out);
for (File file : fileList) {
byte[] buf = new byte[2048];
zos.putNextEntry(new ZipEntry(file.getName()));
int len;
FileInputStream in = new FileInputStream(file);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
out.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 删除中间文件
if (fileList != null) {
for (File file : fileList) {
System.out.println(deleteFile(file));
}
}
}
/**
* 下载文件---返回下载后的文件存储路径
*
* @param url 文件路径
* @param dir 目标存储目录
* @param fileName 存储文件名
* @return
*/
public static void downloadHttpUrl(String url, String dir, String fileName) throws Exception {
try {
URL httpurl = new URL(url);
File dirfile = new File(dir);
if (!dirfile.exists()) {
dirfile.mkdirs();
}
FileUtils.copyURLToFile(httpurl, new File(dir+fileName));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace(); }
}
/**
* 删除文件
*/
public static boolean deleteFile(File file) {
if (file.exists()) {
return file.delete();
}
return false;
}
}