java怎样压缩包的大小 java压缩和解压rar格式,不要zip格式的?
java压缩和解压rar格式,不要zip格式的?
Rar和zip的算法不同。Rar是付费产品,算法不公开。如果要压缩和解压缩rar格式,1。研究一下。Winrar命令2。用java(()调用命令行。exec(cmd))执行。这可以 不能在没有安装winrar的机器上运行。
压缩格式转换大小有哪些?
1. amp的文件名罐子 "是 "Java存档文件 "。从全称可以看出它和Java有关,是一种文件格式,和Zip文件格式很像。不同之处在于,当JAR格式被压缩时,a "元INF… "将生成文件。
2. "Zip "应该每个接触压缩文件的人都知道,也是最常见的。zip的文件压缩后,解压时一般不需要下载单独的解压软件,因为我们的电脑系统对Zip格式支持很大。
3.rar ",虽然Zip在格式中占据了很高的位置,但是现在很多压缩文件格式很大一部分都是rar格式,因为RAR比Zip的压缩成功率更高。
4. "出租车及相关服务是Microsoft安装软件时使用的一种文件格式。因为涉及到安装软件,CAB中的文件格式不再是直接的文件压缩,文件名可以更改。虽然可以直接压缩,但是强压缩后的文件通常打不开。
Java中,哪种压缩算法可以对30M左右的文件做到较大的压缩率,解压后文件MD5值要保持不变?
分析主体的需求如下:
1.高压缩比
保持不变
对应于技术语言,目标压缩算法必须满足两个条件:
1.高压缩效率
2.无损压缩
1.什么是无损压缩?无损压缩是指数据压缩后,信息不丢失,可以完全恢复到压缩前的原始状态。
无损压缩技术主要包括两个步骤:
(1)建模
(2)根据模型,高频部分用短码表示,低频部分用长码表示。
步骤(2)中使用的常见编码技术是霍夫曼编码(也用于DEFLATE)和算术编码。其中算术编码可以达到高级理论的最大压缩率上限。其压缩比高于霍夫曼编码是因为:霍夫曼编码首先对输入数据进行划分分组,每组数据单独编码;算术编码是将多组数据编码在一起。
使用算术编码的压缩算法通常在编码之前估计输入符号的概率。这种估计越精确,编码结果就越接近最佳结果。
2.算术编码的算法描述(1)假设有一段数据需要编码,统计其中的所有字符以及出现的次数。
(2)将区间[0,1]分成若干子区间,每个子区间代表上述字符中的一个,区间的大小与该字符出现在文本中的概率p成正比。那么可能性就越大间隔越大。所有子间隔相加正好为[0,1]。
(3)编码从一个初始区间[0,1]开始,设置:low0,high 1。
(4)不断读取原始数据的字符,找到这个字符所在的区间,比如[L,H],更新:。
低低(高-低)* L
高-低(高-低)* H
(5)最后,将得到的区间[低,高]中的任意小数以二进制形式输出,得到编码数据。
具体例子如下:
阿尔伯
统计它们出现的频率和概率:
将这些字符的区间按照概率逐一排列,我们得到一个[0,1]的划分区间:开始编码,初始区间为[0,1]。注意这里又用到了区间这个词,但是这个区间和上面代表每个字符的概率区间不一样。这里我们可以称之为编码区间,它会发生变化,确切的说是越来越小。循序渐进:
(1)初始编码间隔为[0,1],即
低0
高1
(2)第一个字符A的概率区间是[0,0.2],那么L 0,H 0.2,更新:
低低(高-低)* L0
高-低(高-低)* H0.2
(3)如果第二个字符r的概率区间是[0.6,1],那么L 0.6,H 1,更新:
低低(高-低)* L0.12
高-低(高-低)* H0.2
(3)第三个字符B的概率区间是[0.2,0.4],那么L 0.2,H 0.4,更新:
低低(高-低)* L0.136
高-低(高-低)* H0.152
(4) ......
根据以上描述,不难看出这种算法的特点:
每次编码时,在现有区间上找到子区间,形成 "区间集 ":比如一开始A落在0到0.2上,那么编码区间就缩小到[0,0.2],第二个字符是R,那么R对应的子区间[0.12,0.2]就在[0,0.2]上按比例取出,以此类推。最后,我们得到一个长十进制数,它神奇地包含了所有的原始数据。
3.算术编码的解码过程是编码过程的逆过程。从编码的小数开始,通过不断寻找小数落在哪个概率区间,就可以一个一个地找出原来的字符。例如,如果十进制数是0.14432,那么第一个字符显然是a,因为它落在[0,0.2。),然后看[0,0.2]区间0.14432落在哪个相对子区间,发现是[0.6,1],可以发现第二个字符是r,以此类推。
是如何实现算术编码的?/** *算术编码* */公共类算术{ // Charact:{ A,B,C,D,E,F,$ } } private char[] symbolchars//P:{ 0.2,0.1,0.2,0.05,0.3,0.05,0.1 } private double[]概率公共算术(char[]symbol chars, double[]probability){ symbol chars probability }/* * * * @ param symbols */public double coding(字符串符号){ char[]cs()double symbolRangeLow[]new double[probability . length]for(int I 0 I lt symbolRangeLow . length I){ symbolRangeLow[I]0 for(int j 0j lt I j){ symbolRangeLow[I]probability[j]} } int current symbol double low 0.0 double high 1.0 double range 1.0 for(int I 0 I lt cs . length I){ currents cs[i])低低范围* symbolRangeLow[currentSymbol]高低范围*概率[currentSymbol]范围高-低}返回低(高-低)/ 2 } /** * * @param codeNumber */公共字符串解码(double codeNumber) {字符串符号s double symbolRangeLow[]new double[probability . length]for(int I 0 I lt symbolRangeLow . length I){ symbolRangeLow[I]probability[j]} } double subSymbolRangeLow[]new double[symbolRangeLow . length]double subSymbolRangeLow[]new double[probability . length]double subRangeLow 0 double subRange 0 for(int I 0 I lt symbol chars . length I){ subsymbolrangellow[I]symbol
sub range sub symbolrangelow[I]sub range sub symbolrange[I]current symbol I } } double sub symbolprobsum sub range for(int I 0 I lt symbol chars . length I){
subSymbolRange[I]subRange * probability[I]subSymbolRangeLow[I]subSymbolProbSum subSymbolProbSum subSymbolRange[I]} symbol chars[current symbol]} while(symbol chars[current symbol]!$)return symbols } public int getIndex(char[]cs,char C){ for(int I 0 I lt cs . length I){ if(cs[I]C){ return-1 }//Test public static void main(String args[]){ char[]symbolchars { A,B,C,D,E,F,$ } double[] probability { 0.2,0.1,0.2,0.05,0.3,0.05,0.1 }算术算术新算术(symbol chars,probability
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。