JarOutputStream保持与输入文件相同的压缩属性

利用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);

猜你喜欢

转载自blog.csdn.net/Na2Co3_Ren/article/details/80392769