利用JarFile和JarOutputStream类配合,拆开jar包后重组jar包,这时会发现:
1)如果原来jar包处于压缩状态,则重组后的jar包大小与原jar包相同
2)如果原来jar包处于未压缩状态,则重组后的jar包会进行压缩,其大小将小于原jar包
造成这种现象的原因是:利用JarOutputStream重组jar包的时候,默认会进行压缩,并可以利用setLevel函数对压缩等级进行设定(0-9)。0表示不压缩,但是经过测试发现,当level为0时,测试的jar包会增大。
网上资料说可以用setMethod函数进行设置,setMethod的参数有两个选项STORED(不压缩),DEFLETE(压缩)。这两个选项可以控制是否需要压缩,使用STORED的时候,还需使用setSize和setCrc两个函数对zipEntry进行设置,但是经过测试,设置为STORED时,总是失败,应该是setSize和setCrc两个函数没用正确。因此采用另外的方式实现。
//treeJarEntries里保存的是输入文件名和JarEntry对象的map。
//map.key=name,map.value=JarEntry的对象
JarEntry inputJar = (JarEntry)treeJarEntries.get(name);
JarEntry jeNew;
if (inputJar.getMethod() == JarEntry.STORED)
{
jeNew = new JarEntry(inputJar);
}
else
{
jeNew = new JarEntry(name);
}
先获取原始的JarEntry是什么属性,如果为STORED,则利用输入的JarEntry来初始化输出的JarEntry,否则利用文件名初始化输出的JarEntry。
利用这个就可以使JarFile和JarOutputStream配合生成的jar包大小和原来相等。
刚才突然想到,上面的代码可以简化一些:
JarEntry inputJar = (JarEntry)treeJarEntries.get(name);
JarEntry jeNew = new JarEntry(inputJar);