之前使用过Java API进行文件的压缩与解压缩,对于中文的处理问题是一个很大的问题(这个问题在新版的java jdk里面好像已经解决),由于这个原因,后来找来了Apache解决了中文问题.
但是不管是使用jdk自带的还是外部的API,进行文件的压缩性能都提不上去.这种方式要是压缩比较大的文件时,要占用太多的虚拟机资源,这不是什么好的点子.
在这篇博客中,将简单说明怎么用Java API调用外部程序进行文件的压缩和解压缩.
1.使用外部程序:7zip进行文件的压缩.可以在这里下载:7zip 绿色版命令行打包工具.
7zip是一个很小的命令行打包工具,使用java调用外部程序进行打包,它是不二之选.关于7zip的一些命令可以把该文件下载下来后,在dos命令窗口打开该程序,所有命令都显示出来,具体不作详细的介绍了.
2.批处理命令:xx.bat 相信熟悉Linux的朋友,这个不陌生,在window下使用批处理命令同样能带来很大的方便.在该案例中使用到简单地批处理命令语句.更详细的批处理语句可以网上找下,比如这个:bat命令学习.跳过跳过..
3.主要操作:
a. 把7zip下载下来后,选一个适合自己的版本,我用X86的.把x86类型的7za.exe拷贝到你自己的项目中,写一个代码能索引到7za.exe所在的包目录.
b.同样在7za.exe所在的包的目录下,存放一份bat的文件,我的命名zip.bat,里面代码如下
set thisPath=%1
set zipName=%2
set fileName=%3
%thisPath%\7z a -r -tzip %thisPath%\%zipName%.zip %thisPath%\%fileName% 注释:7z为7za.exe的命名,我的项目里命名为7z.exe.其他是传进来的
调用的时候,三个变量要传进来,当前的路径thisPath(就是7za.exe所在的绝对路径),要压缩的成的压缩文件名zipName和对那个文件进行操作的fileName.
说明下,这里我的临时文件是都在thisPath下的,生成的压缩文件也临时放在这里.要是是对不同路径下的文件进行压缩和存放在压缩后的文件在不同的地方的时候,可以把这些文件的前面的thisPath的参数换掉,视具体情况而定.比如我想存放压缩好的文件到其他地方去,最后一句bat语句可以这样写:
set fileName=%3
set storeZipPath=%4
%thisPath%\7z a -r -tzip %storeZipPath%\%zipName%.zip %thisPath%\%fileName%
但是thisPath变量一定要能索引到7za.exe文件.
c.java 调用代码:
private static java.io.File generateZip(String zipName,String fileName)
{
java.io.File file = new java.io.File(getTempPath()+"/"+fileName);
if(!file.exists())
{
return null;
}
Runtime run = Runtime.getRuntime();
BufferedInputStream in=null;
BufferedReader inBr=null;
Process process=null;
try {
StringBuffer cmd =new StringBuffer();
cmd.append(getTempPath()+"\\"+"zip.bat");
cmd.append(" "); //传参的时候以空格符分开代表第几个参数.
cmd.append(getTempPath()); //传第一个参数
cmd.append(" ");
cmd.append(zipName); //传第二个参数
cmd.append(" ");
if(file.isFile())
{
cmd.append(fileName); //传第三个参数
}
else
{
cmd.append(fileName+"\\*"); //这里说明下 7zip 压缩文件夹的时候的命令是:[7za a -r -tzip zipName fileName\*]后面的\*是指明递归,
//别忘记要当时文件夹时要传进去.
}
process =run.exec(cmd.toString()); //执行语句 ,这句后面的就是输出语句了,要是想不看输出,后面的代码可以酌情删除
in = new BufferedInputStream(process.getInputStream());
inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
{
System.out.println(lineStr);
}
if (process.waitFor() != 0)
{
if (process.exitValue() == 1)
{
System.err.println("命令执行失败!");
}
}
file.delete();
file=null;
java.io.File zipFile = new java.io.File(getTempPath()+"/"+fileName+".zip");
if(zipFile.exists())
{
return zipFile;
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(null!=inBr)
{
inBr.close();
}
if(null!=in)
{
in.close();
}
}catch (Exception e )
{
e.printStackTrace();
}
}
return null;
}
d.执行结果:
看命令行输出 :
打包后的结果:
打完收工!!!!