java有什么库压缩zip非常快的?

万年水母 2009-07-30 06:18:15
用java.util.zip压缩的速度和压缩比率不太理想,有没其它库可以大副提高速度,或者相同速度下提供更高压缩比率的库?我在网上找了一下没找到什么资料。
...全文
367 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liboofsc 2009-07-31
  • 打赏
  • 举报
回复
这里以前在一个项目里用过的,希望对你有帮助,大家多指正。

package ziputil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* 压缩实现类 <br>
* 主要实现: <br>
* <p>压缩单个文件、
* <p>压缩文件夹下的所有文件及子文件夹
*
* <p>
*
* @author libo
*
*/

public class ZipTool {

/**
* 压缩单个文件
* @param filePath 文件路径
* @param fileName 文件名字
* @param objDir 压缩文件目标文件夹
* @param ojbZipName 压缩文件名字
* @return
* @throws IOException
*/
public boolean zip(String filePath, String fileName, String objDir,
String ojbZipName) throws IOException {
boolean tag = false;
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objDir
+ ojbZipName));

FileInputStream fis = new FileInputStream(filePath + fileName);
byte[] b = new byte[4096];
int i = 0;

zos.putNextEntry(new ZipEntry(fileName));
while ((i = (fis.read(b))) > 0) {
zos.write(b, 0, i);
}

fis.close();
zos.close();

return tag;
}

/**
* 压缩一个文件夹下的所有文件 注意中间路径连接用"/" 如:c:/tt/ttt
* @param srcPath 要压缩的文件夹路径
* @param objZipPath 目标文件夹路径
* @param ojbZipName 目标压缩文件名字
* @return
*/
public boolean zipDir(String srcPath, String objZipPath, String ojbZipName){

ZipOutputStream zos = null;
try {
File objFile = new File(objZipPath , ojbZipName);
zos = new ZipOutputStream(new FileOutputStream(objFile));

if (srcPath == null) {
System.out.println("传入的源文件夹路径字符串不能为空!");
throw new java.lang.NullPointerException();
}
String dirName = "";
File file = new File(srcPath);
if (!file.isDirectory()) {
throw new Exception("传入了不正确的源文件夹路径!");
} else {
dirName = srcPath.substring(srcPath.lastIndexOf("/") + 1);
if (dirName == null || "".equals(dirName)) {
String subStr = srcPath.substring(0, srcPath.length() - 2);
dirName = subStr.substring(subStr.lastIndexOf("/") + 1);
}
ZipEntry ze = new ZipEntry(dirName + "/");
zos.putNextEntry(ze);
if (dirName == null || "".equals(dirName)) {
throw new Exception("传入了不正确的源文件夹路径!");
}
}

File[] files = file.listFiles();

for (int i = 0; i < files.length; i++) {
zipFile(dirName + "/", files[i], zos);
}
return true;
} catch (Exception e) {
System.out.println("压缩文件时出现异常!");
e.printStackTrace();
return false;
}finally{
if(zos != null){
try {
zos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}

/**
* 用来压缩文件夹下的所有子文件
* 此方法为一个递归调法方法
* @param zipPath 要压缩的文件在压缩包中的相对路径
* @param file  要压缩的文件引用
* @param zos   压缩文件输出流
* @throws IOException
*/
private void zipFile(String zipPath, File file, ZipOutputStream zos)
throws IOException {
//是文件夹的操作
if (file.isDirectory()) {
ZipEntry ze = new ZipEntry(zipPath + file.getName() + "/");
zos.putNextEntry(ze);
//递归调用
for (int i = 0; i < file.listFiles().length; i++) {
zipFile(zipPath + file.getName() + "/", file.listFiles()[i], zos);
}
//是文件时的操作
}else{
FileInputStream fis = null;
try{
fis = new FileInputStream(file);
ZipEntry ze = new ZipEntry(zipPath + file.getName());
zos.putNextEntry(ze);
byte []b = new byte[4096];
int i = 0;
while( ( i = (fis.read(b)) ) > 0 ){
zos.write(b, 0, i);
}
}finally{
if(fis != null){
fis.close();
}
}
}
}



public static void main(String[] args) {
ZipTool zt = new ZipTool();
try {
zt.zipDir("c:/gif", "c:/", "test.zip");
} catch (Exception e) {
e.printStackTrace();
}
}

}

liboofsc 2009-07-31
  • 打赏
  • 举报
回复
代码看看。
Miracle1216 2009-07-31
  • 打赏
  • 举报
回复
不要每次压一个字节。
代码弄出来看看
万年水母 2009-07-31
  • 打赏
  • 举报
回复
我是直接压进一个ByteArrayOutputStream,应该不需要使用Buffered流封装吧?

我主要是希望可以找到一些利用外部原生代码进行压缩的库,比如windows下调用winzip.dll之类的库就好了,这样速度应该可以保证。
捏造的信仰 2009-07-30
  • 打赏
  • 举报
回复
算法是有参数可以调整的吧。字典大的时候速度就会慢。
ouyangyh 2009-07-30
  • 打赏
  • 举报
回复
个人感觉,这个东东应该比较快啊
你有没有Buffered流封装呢?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧