1,概念
1)无损压缩和有损压缩
- 有损压缩:压缩之后就无法完整还原原始信息,但是压缩率可以很高,主要应用于视频、话音等数据的压缩;
- 无损压缩:用于文件等等必须完整还原信息的场合。ZIP、RAR、GZIP、GIF、PNG等等都是无损压缩格式。
2,文件压缩与打包
1)ZIP压缩
- 场景:jar包
- shell命令:
需要先下载zip for linux。
功能 | 命令 | 备注 |
---|
将jpg格式的文件压缩 | zip jpg.zip *.jpg | |
将几个文件和目录同时压缩 | zip -r file1.zip file1 file2 dir1 | |
解压zip | unzip file.zip | |
2)jar打包(Java Archive File,Java 归档文件)、war打包(Web Application Archive)
- jar包 = class文件 + 资源 + 配置文件 = zip + META-INF(清单文件);
一个jar包就是一个java应用程序。 - 平台无关的文件格式;
- jar文件使用了ZIP压缩格式,通过unzip命令可以解压;
1>Pack200
Java5提供的压缩工具,能对普通的jar文件进行高效压缩。
实现原理:根据Java类特有的结构,合并常数池,去掉无用信息等来实现对java类的高效压缩。对于Jar文件却能轻易达到10-40%的压缩率,甚至接近90%。这在Java应用部署中很有用,尤其对于移动Java计算,能够大大减小代码下载量。
压缩
Packer packer=Pack200.newPacker();
OutputStream output=new BufferedOutputStream(new FileOutputStream(outfile));
packer.pack(new JarFile(jarFile), output);
output.close();
解压
Unpacker unpacker=Pack200.newUnpacker();
output=new JarOutputStream(new FileOutputStream(jarFile));
unpacker.unpack(pack200File, output);
output.close();
2>shell命令
常见参数:
-c 创建新的JAR文件包、war文件包
-t 列出JAR文件包的内容列表。
-x 展开JAR文件包的指定文件或全部文件。
-u 更新已存在的JAR包。对于一个已经存在的JAR包。我们任然能够向当中加入新的字节码文件或旧的字节码文件,假设已经存在路径、类名都同样的文件,则更新源文件,假设不存在。则加入该文件。清单文件也能够通过这种方式更改。
-v 显示过程并输出。
-f 指定JAR包的文件名称。通常该选项是必选的。
-m 指定须要包括的MANIFEST.MF清单文件。
-O 仅仅存储。不压缩。 生成的JAR包体积大,但运行速度快。
-M 不产生全部项的清单文件,此參数会忽略-m选项。
[-C 文件夹] 表示转到指定文件夹下去运行jar命令的操作,它相当于优先使用cd命令转到指定文件夹下运行不带-C參数的jar命令。它仅仅能在创建和更新JAR包的时候使用
功能 | 命令 | 备注 |
---|
包启动 | | |
启动jar包 | java -jar test.jar | |
启动war包 | java -jar jenkins.war –httpPort=8090 | war包一般要放在tomcat中,jenkins的war包自带Jetty服务器,可以直接运行 |
包解压 | | |
包解压 | jar -xvf xxx.war | 解压到当前文件夹,并显示解压过程 |
包解压到目标目录 | unzip .jar -d 目录 | |
包压缩 | | |
把当前目录下的所有文件打包成game.war | jar -cvfM0 game.war ./ | -0 这个是阿拉伯数字,只打包不压缩的意思 |
将com下的class文件打包成jar | jar cvf allenwells.jar com | 覆盖原文件 |
向allenwells.jar中加入manifest.mf文件 | jar uvf allenwells.jar manifest.mf | 作为普通文件加入。通过-m-m选项设置清单文件 |
使用自己定义的清单文件mymanifest.mf并将com/文件夹下的全部文件归档到allenwells.jar中 | jar cvfm allenwells.jar mymanifest.mf -C com/ . | |
包信息查看 | | |
显示jar内文件的具体信息 | jar tvf allenwells.jar | |
3>MANFEST.MF文件
常见属性:
Manifest-Version
用来定义manifest文件的版本号,比如:Manifest-Version: 1.0。最小的清单文件只包含这一条。
Created-By
声明该文件的生成者,一般该属性是由jar命令行工具生成的。比如:Created-By: Apache Ant 1.5.1
Signature-Version
定义jar文件的签名版本号
Class-Path
应用程序或者类装载器使用该值来构建内部的类搜索路径
Main-Class
定义jar文件的入口类。该类必须是一个可运行的类,一旦定义了该属性就可以通过 java -jar x.jar来运行该jar文件。
3)rar压缩(Roshal ARchive)
- 相比zip压缩:压缩率高、解压压缩慢
1>shell命令
功能 | 命令 | 备注 |
---|
解压rar | unrar e file.rar | |
压缩rar | rar a jpg.rar *.jpg | 需要先下载rar for Linux 。 |
同时压缩file1,file2,以及目录dir1 | rar a file1.rar file1 file2 dir1 | |
4)tar打包、tar.gz压缩
- linux将多个文件打成tar包。
- 经过gzip压缩后的tar文件,形成tar.gz包,扩展名为“xx.tar.gz”;
- java通过assembly.xml来打包。
1>shell命令
参数:
5个独立命令,可以和其它命令连用但只能用其中一个:
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
5个可选命令:
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
1个必备参数:表示归档名
-f name.tar
功能 | 命令 | 备注 |
---|
解压 tar包 | tar –xvf file.tar | |
解压tar.gz | tar xzvf dist_10_30.tar.gz -C /www | 解压到对应目录www |
压缩test为tar.gz包 | tar -czvf test.tar.gz test | |
将目录里所有jpg文件打成tar包并压缩 | tar –czf jpg.tar.gz *.jpg | 去掉-z不压缩直接打tar包 |
将所有.gif的文件增加到all.tar的包里面去 | tar -rf all.tar *.gif | |
更新原来tar包all.tar中logo.gif文件 | tar -uf all.tar logo.gif | |
列出all.tar包中所有文件 | tar -tf all.tar | |
5)其他
功能 | 命令 | 备注 |
---|
压缩 | bzip2 file1 | |
压缩 | gzip file1 | |
解压 tar.bz2 | tar -xjvf file.tar.bz2 | |
解压tar.Z | tar –xZvf file.tar.Z | |
解压bz2 | bunzip2 file1.bz2 | |
解压gz | gunzip file1.gz | |
6)*.aar,AAR(Android Archive)
- Android库项目的二进制归档文件,包含所有资源,class以及res资源文件。
AAR = AndroidManifest.xml + classes.jar + res + R.txt - 解压:找一个aar文件,然后修改后缀名为‘zip’或者‘rar’格式,然后解压该文件;
- 对于一些不常变动的 Android Library,我们可以直接引用 aar,加快编译速度。