import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gingkoo.rpt.common.server.SysParamService;
import com.gingkoo.util.mail.test;
public class FileCompress implements Runnable{
private final Logger logger = LoggerFactory.getLogger(getClass());
private static final int BUFFER_SIZE = 2 * 1024;
@Override
public void run() {
List<File> list = new ArrayList<>();
List list2 = new ArrayList<>();
list.add(new File("D:\\dcnvatreg2\\full\\log\\"));
list.add(new File("D:\\dcnvatreg2\\full\\backup\\"));
try {
List<File> files = searchFiles(list, "201903");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//根据关键字获取文件 //多文件
public static List<File> searchFiles(List<File> list, final String keyword) {
List<File> result= new ArrayList<>();
for (File file : list) {
File[] subFolders = file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
//文件夹也查询出来
if (file.isDirectory()&&file.getName().toLowerCase().contains(keyword)) {
return true;
}
if (file.getName().toLowerCase().contains(keyword)) {
return true;
}
return false;
}
}
);
if (subFolders != null) {
String[] srcDir = new String[subFolders.length];
for (int i = 0; i < srcDir.length; i++) {
srcDir[i]=subFolders[i].getPath();
}
String outDir = file.getPath()+File.separator+SysParamService.getSysParam("5001|file.keyword")+".tar.gz";
try {
toZip(srcDir, outDir, true);
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return result;
}
/**
* @param srcDir 压缩文件夹路径
* @param out 压缩文件输出流
* @param KeepDirStructure 是否保留原来的目录结构,
* true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(String[] srcDir, String outDir,
boolean KeepDirStructure) throws RuntimeException, Exception {
OutputStream out = new FileOutputStream(new File(outDir));
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
List<File> sourceFileList = new ArrayList<File>();
for (String dir : srcDir) {
File sourceFile = new File(dir);
sourceFileList.add(sourceFile);
}
compress(sourceFileList, zos, KeepDirStructure);
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 递归压缩方法
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param KeepDirStructure 是否保留原来的目录结构,
* true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/
private static void compress(File sourceFile, ZipOutputStream zos,
String name, boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];
if (sourceFile.isFile()) {
zos.putNextEntry(new ZipEntry(name));
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
if (KeepDirStructure) {
zos.putNextEntry(new ZipEntry(name + "/"));
zos.closeEntry();
}
} else {
for (File file : listFiles) {
if (KeepDirStructure) {
compress(file, zos, name + "/" + file.getName(),
KeepDirStructure);
} else {
compress(file, zos, file.getName(), KeepDirStructure);
}
}
}
}
}
private static void compress(List<File> sourceFileList,
ZipOutputStream zos, boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];
for (File sourceFile : sourceFileList) {
String name = sourceFile.getName();
if (sourceFile.isFile()) {
zos.putNextEntry(new ZipEntry(name));
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
if (KeepDirStructure) {
zos.putNextEntry(new ZipEntry(name + "/"));
zos.closeEntry();
}
} else {
for (File file : listFiles) {
if (KeepDirStructure) {
compress(file, zos, name + "/" + file.getName(),
KeepDirStructure);
} else {
compress(file, zos, file.getName(),
KeepDirStructure);
}
}
}
}
}
}
}
查找指定文件文件压缩
最新推荐文章于 2022-08-27 13:22:23 发布