经过自己的探索,对业务场景的各种业务都做了实现,大功告成码代码如下,方便以后查阅:
1 某文件夹下所有文件压缩(不能含文件夹)
/**
* 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
* @param sourceFilePath :待压缩的文件路径
* @param zipFilePath :压缩后存放路径
* @param fileName :压缩后文件的名称
* @return
*/
public static boolean fileToZip(String sourceFilePath,String zipFilePath,String fileName){
boolean flag = false;
File sourceFile = new File(sourceFilePath);
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;
if(sourceFile.exists() == false){
System.out.println("待压缩的文件目录:"+sourceFilePath+"不存在.");
}else{
try {
File zipFile = new File(zipFilePath + "/" + fileName +".zip");
if(zipFile.exists()){
System.out.println(zipFilePath + "目录下存在名字为:" + fileName +".zip" +"打包文件.");
}else{
File[] sourceFiles = sourceFile.listFiles();
if(null == sourceFiles || sourceFiles.length<1){
System.out.println("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩.");
}else{
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
byte[] bufs = new byte[1024*10];
for(int i=0;i<sourceFiles.length;i++){
//创建ZIP实体,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
zos.putNextEntry(zipEntry);
//读取待压缩的文件并写进压缩包里
fis = new FileInputStream(sourceFiles[i]);
bis = new BufferedInputStream(fis, 1024*10);
int read = 0;
while((read=bis.read(bufs, 0, 1024*10)) != -1){
zos.write(bufs,0,read);
}
}
flag = true;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//关闭流
try {
if(null != bis) bis.close();
if(null != zos) zos.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
return flag;
}
public static void main(String[] args){
String sourceFilePath = "D:\\DATA\INS.DATA\\ftp\\ffsdf\\foreign_k";
String zipFilePath = "D:\\tmp";
String fileName = "12700153file";
boolean flag = FileToZip.fileToZip(sourceFilePath, zipFilePath, fileName);
if(flag){
System.out.println("文件打包成功!");
}else{
System.out.println("文件打包失败!");
}
}
2 经过改造 可以支持文件夹下指定文件压缩(该文件夹下不可含有文件夹)
/**
* 指定文件压缩
* @param sourceNameList
* @param zipFilePath
* @param fileName
* @return
*/
public static boolean partFileToZip(List<String> sourceNameList,String zipFilePath,String fileName){
boolean flag = false;
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;
if(sourceNameList == null || sourceNameList.isEmpty()){
System.out.println("待压缩的文件:不存在.");
log.error("待压缩的文件:不存在.");
}else{
try {
File zipFile = new File(zipFilePath + "/" + fileName +".zip");
if(zipFile.exists()){
System.out.println(zipFilePath + "目录下存在名字为:" + fileName +".zip" +"打包文件.");
log.error(zipFilePath + "目录下存在名字为:" + fileName +".zip" +"打包文件.");
}else{
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
byte[] bufs = new byte[1024*10];
for(String str : sourceNameList){
File file = new File(str);
if(!file.exists()){
System.out.println("待压缩的文件:" + file + "里面不存在文件,无需压缩.");
log.error("待压缩的文件:" + file + "里面不存在文件,无需压缩.");
continue;
}
//创建ZIP实体,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
//读取待压缩的文件并写进压缩包里
fis = new FileInputStream(str);
bis = new BufferedInputStream(fis, 1024*10);
int read = 0;
while((read=bis.read(bufs, 0, 1024*10)) != -1){
zos.write(bufs,0,read);
}
}
flag = true;
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
finally{
//关闭流
try {
if(null != bis) bis.close();
if(null != zos) zos.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
return flag;
}
public static void main(String[] args){
String aFile = "D:\\logs\\daily.log.2018-03-08.log";
String bFile = "D:\\logs\\daily.log.2018-03-16.log";
List<String> sourceNameList = new ArrayList<>();
sourceNameList.add(aFile);
sourceNameList.add(bFile);
String zipFilePath = "D:\\tmp";
String fileName = "222file";
boolean flag = FileToZip.partFileToZip(sourceNameList, zipFilePath, fileName);
if(flag){
System.out.println("文件打包成功!");
}else{
System.out.println("文件打包失败!");
}
}
3 文件夹下所有文件压缩(文件夹下可以含有文件夹)
/**
* 创建ZIP文件 压缩文件夹下的所有文件
* @param sourcePath 文件或文件夹路径
* @param zipPath 生成的zip文件存在路径(包括文件名)
*/
public static void createZip(String sourcePath, String zipPath) {
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipPath);
zos = new ZipOutputStream(fos);
//zos.setEncoding("gbk");//此处修改字节码方式。
//createXmlFile(sourcePath,"293.xml");
writeZip(new File(sourcePath), "", zos);
} catch (FileNotFoundException e) {
log.error("创建ZIP文件失败",e);
} finally {
try {
if (zos != null) {
zos.close();
}
} catch (IOException e) {
log.error("创建ZIP文件失败",e);
}
}
}
/**
* 压缩文件夹下的所有文件
* @param file
* @param parentPath
* @param zos
*/
private static void writeZip(File file, String parentPath, ZipOutputStream zos) {
if(file.exists()){
if(file.isDirectory()){//处理文件夹
parentPath+=file.getName()+File.separator;
File [] files=file.listFiles();
if(files.length != 0)
{
for(File f:files){
writeZip(f, parentPath, zos);
}
}
else
{ //空目录则创建当前目录
try {
zos.putNextEntry(new ZipEntry(parentPath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else{
FileInputStream fis=null;
try {
fis=new FileInputStream(file);
ZipEntry ze = new ZipEntry(parentPath + file.getName());
zos.putNextEntry(ze);
byte [] content=new byte[1024];
int len;
while((len=fis.read(content))!=-1){
zos.write(content,0,len);
zos.flush();
}
} catch (FileNotFoundException e) {
log.error("创建ZIP文件失败",e);
} catch (IOException e) {
log.error("创建ZIP文件失败",e);
}finally{
try {
if(fis!=null){
fis.close();
}
}catch(IOException e){
log.error("创建ZIP文件失败",e);
}
}
}
}
}
public static void main(String[] args){
String sourceFilePath = "D:\\DATA\\INS.DATA\\ftp\\dasd\\fore";
String zipOutFilePath = "D:\\tmp\\12700153file.zip";
createZip(sourceFilePath, zipOutFilePath);
}
4 文件夹下指定文件压缩(文件夹下可以含有文件夹)
/**
* 创建ZIP文件(压缩指定文件下的文件夹)
* @param sourcePath 文件或文件夹路径
* @param zipPath 生成的zip文件存在路径(包括文件名)
* @param sourceNameList 需要压缩的文件名(全路径)
*/
public static void createZip(String sourcePath, String zipPath,List<String> sourceNameList) {
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipPath);
zos = new ZipOutputStream(fos);
//zos.setEncoding("gbk");//此处修改字节码方式。
//createXmlFile(sourcePath,"293.xml");
writeZip(new File(sourcePath), "", zos,sourceNameList);
} catch (FileNotFoundException e) {
log.error("创建ZIP文件失败",e);
} finally {
try {
if (zos != null) {
zos.close();
}
} catch (IOException e) {
log.error("创建ZIP文件失败",e);
}
}
}
/**
* 压缩指定的文件夹下的文件(压缩后包括文件夹)
* @param file
* @param parentPath
* @param zos
* @param sourceNameList
*/
private static void writeZip(File file, String parentPath, ZipOutputStream zos,List<String> sourceNameList) {
if(file.exists()){
if(file.isDirectory()){//处理文件夹
parentPath+=file.getName()+File.separator;
File [] files=file.listFiles();
if(files.length != 0)
{
for(File f:files){
for(String str : sourceNameList){
if(str.startsWith(f.getPath())){
writeZip(f, parentPath, zos,sourceNameList);
break;
}
}
}
}
else
{ //空目录则创建当前目录
try {
zos.putNextEntry(new ZipEntry(parentPath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else{
FileInputStream fis=null;
try {
fis=new FileInputStream(file);
ZipEntry ze = new ZipEntry(parentPath + file.getName());
zos.putNextEntry(ze);
byte [] content=new byte[1024];
int len;
while((len=fis.read(content))!=-1){
zos.write(content,0,len);
zos.flush();
}
} catch (FileNotFoundException e) {
log.error("创建ZIP文件失败",e);
} catch (IOException e) {
log.error("创建ZIP文件失败",e);
}finally{
try {
if(fis!=null){
fis.close();
}
}catch(IOException e){
log.error("创建ZIP文件失败",e);
}
}
}
}
}
public static void main(String[] args){
String aFile = "D:\\DATA\\INS.DATA\\ftp\\fsdf\\eww\\201808\\0824.ave";
String bFile = "D:\\DATA\\INS.DATA\\ftp\\fsdf\\eww\\201808\\0825.ave";
String cFile = "D:\\DATA\\INS.DATA\\ftp\\fsdf\\eww\\201805\\0501.ave";
String dFile = "D:\\DATA\\INS.DATA\\ftp\\fsdf\\eww\\201808\\0824_1.ave";
List<String> sourceNameList = new ArrayList<>();
sourceNameList.add(aFile);
sourceNameList.add(bFile);
sourceNameList.add(cFile);
sourceNameList.add(dFile);
String zipOutFilePath = "D:\\tmp\\127001file.zip";
createZip(sourceFilePath, zipOutFilePath,sourceNameList);
}