如何将java代码压缩 java程序压缩包怎么运行( 二 )


System.out.println("压缩:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/** 压缩一个目录 */
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; ifiles.length; i++) {
/* 递归 */
compress(files[i], out, basedir + dir.getName() + "/");
}
}
/** 压缩一个文件 */
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单 。
package net.szh.zip;
import java.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
public class ZipCompressorByAnt {
private File zipFile;
public ZipCompressorByAnt(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File srcdir = new File(srcPathName);
if (!srcdir.exists())
throw new RuntimeException(srcPathName + "不存在!");
Project prj = new Project();
Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");
//fileSet.setExcludes(...); 排除哪些文件或文件夹
zip.addFileset(fileSet);
zip.execute();
}
}
测试一下
package net.szh.zip;
public class TestZip {
public static void main(String[] args) {
ZipCompressor zc = newZipCompressor("E:\\szhzip.zip");
zc.compress("E:\\test");
ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");
zca.compress("E:\\test");
}
}
用java如何实现压缩字符串?package javase1.day02;\x0d\x0a /**\x0d\x0a*1)一种字符串压缩算法\x0d\x0a*str ="aaaabbccccddeaaa"\x0d\x0a*压缩为:"4a2b4c2d1e3a"\x0d\x0a*原理实现:\x0d\x0a*str = "aaaabbccccddeaaa"\x0d\x0a*\x0d\x0a*c = str.charAt(i)//c是每个字符\x0d\x0a*1) 初始化\x0d\x0a*StringBuilder buf = new StringBuilder();\x0d\x0a*int count = 0;代表相同的字符个数\x0d\x0a*char ch = str.charAt(0);代表正在统计的相同字符'a'\x0d\x0a*2) 从i=1开始迭代每个字符\x0d\x0a*c = str.charAt(i);//c是每个当前字符\x0d\x0a*3) 检查当前字符c与被统计ch是否一致\x0d\x0a*如果一致 count++\x0d\x0a*否则(不一致)\x0d\x0a*向缓冲区buf增加count+ch\x0d\x0a*count=0,ch=c;\x0d\x0a*3)没有下个字符就结束\x0d\x0a*4)还有字符串吗?回到2)\x0d\x0a*\x0d\x0a*2)实现还原算法\x0d\x0a*str= "4a2b4c2d1e3a";\x0d\x0a*i\x0d\x0a*/\x0d\x0apublic class Demo5 {\x0d\x0a public static void main(String[] args) {\x0d\x0aString s =comp("aaaawwwwe");\x0d\x0aSystem.out.println(s);\x0d\x0a//System.out.println(decomp(s));\x0d\x0a\x0d\x0a }\x0d\x0a public static String comp(String str){\x0d\x0aint i = 1;\x0d\x0aStringBuilder buf = new StringBuilder();\x0d\x0aint count = 1;\x0d\x0achar ch = str.charAt(0);\x0d\x0afor(;;){\x0d\x0achar c = i==str.length() ? '\10':str.charAt(i);\x0d\x0aif(c==ch){\x0d\x0acount++;\x0d\x0a}else{\x0d\x0aif(count == 1)\x0d\x0abuf.append(ch);\x0d\x0aelse \x0d\x0abuf.append(count).append(ch);\x0d\x0acount=1;\x0d\x0ach = c;\x0d\x0a} \x0d\x0ai++;\x0d\x0aif(i==str.length()+1){\x0d\x0abreak;\x0d\x0a} \x0d\x0a}\x0d\x0areturn buf.toString();\x0d\x0a\x0d\x0a }\x0d\x0a}

推荐阅读