用java将数据压缩为一个ZIP包
1:多文件压缩为一个zip
接口使用:zipFileName为输出zip包的名字,infile为需要压缩的多个文件存放的目录,
public void zip(String zipFileName,String inFile) throws FileNotFoundException {
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bo = new BufferedOutputStream(zipOutputStream);
File file = new File(inFile);
if (file.isDirectory()){//递归遍历文件
File[] files = file.listFiles();
for (File f : files) {
zip(zipFileName,f.toString());
}
}else {//进行文件压缩
try {
//创建文件的压缩点
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
//构建输入流
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream inputStream = new BufferedInputStream(fileInputStream);
int a;
//inputStream.read()获取字节信息
while ((a=inputStream.read())!=-1){
bo.write(a);//字节流写入
}
//进行流的关闭
inputStream.close();
fileInputStream.close();
bo.flush();
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2:将字节数组存为zip文件
map<file,byte[]>:key是文件名,value是该文件的内容,可以利用字节流将内容读取为字节
public static boolean saveToZip(Map<String, byte[]> map) throws IOException {
Iterator iterator = map.keySet().iterator();
boolean flag = false;
//zippath:zip输出路径
if (!(zipPath.endsWith(File.separator))) {
zipPath = zipPath + File.separator;
}
File file = new File(zipPath);
if (!file.exists()) {
file.mkdirs();
LOG.info("mkdir zippath success");
}
String zipname = "";
while (iterator.hasNext()) {
String fileName = iterator.next().toString();
if (fileName.contains(".bcp")) {
String[] split = fileName.split(".bcp");
zipname = zipPath + split[0] + ".zip.ing";
}
}
ZipOutputStream out = null;
BufferedOutputStream bo = null;
try {
out = new ZipOutputStream(new FileOutputStream(zipname));
bo = new BufferedOutputStream(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Iterator<String> iterator1 = map.keySet().iterator();
boolean b = iterator1.hasNext();
System.out.println(b);
while (iterator1.hasNext()) {
String s = iterator1.next().toString();
out.putNextEntry(new ZipEntry(s));
bo.write(map.get(s));
// 输入流关
bo.flush();
}
bo.close();
out.close();
LOG.info("zip file success:" + zipname);
rename(zipname);
return flag;
}
private static void rename(String filename) {
File file = new File(filename);
if (file.exists() && filename.endsWith(".ing")) {
String[] split = filename.split(".ing");
String newZipName = split[0];
File file1 = new File(newZipName);
if (file1.exists()) {
file.delete();
return;
}
try {
FileUtils.moveFile(file, new File(newZipName));
} catch (IOException e) {
e.printStackTrace();
}
}
}