Java基础之-压缩与解压
java,压缩,解压2016-08-11
在Java的原生API里,只提供了ZIP和GZIP的压缩与解压。在本文中,除了用原生的API进行压缩与解压操作之外。小弟还将介绍一种比较酷炫的方法。通过Runtime执行命令来做。
gzip压缩文件的后缀为.gz,gzip除了是一种压缩文件之外,还常常被用在网络传输中进行数据压缩。在Java中,GZIP针对的是单文件的压缩与解压。
如果想实现多文件压缩,需要先将文件压缩成tar,在将tar压缩为gz,这里就不说了。
Gzip压缩对应的是GZIPOutputStream,我们只需要将普通的输出流包装成GZIPOutputStream,就可以了。不过,需要注意的是在使用完毕一定要关闭 一定要关闭,否则你去解压的时候可是会装载异常的,那么我们看下代码。
private static void compress() {
try {
//创建GZIP 文件 .gz
File file = new File("./demo.gz");
if (file.exists()){
file.delete();
}
file.createNewFile();
byte[] b_1 = new String("测试gzip压缩").getBytes("utf-8");
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new FileOutputStream(file));
gzipOutputStream.write(b_1);
gzipOutputStream.flush();
gzipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
额,同样解压就是包装一下普通流,废话不多说,直接上代码。
private static void uncompress() {
File file = new File("./demo.gz");
try {
GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(file));
byte[] b = new byte[1024];
while (gzipInputStream.read(b) != -1){
System.err.println("读取到的内容");
System.err.println(new String(b).trim());
}
} catch (IOException e) {
e.printStackTrace();
}
}
虽然说java原生api中gzip是对单文件(流)进行操作的,可是我们的zip缺能对多文件进行操作。并且Zip支持两种Checksum类来计算和校验文件的校验和方法,支持两种:
zip的压缩是这样的,每一个文件对应一个ZipEntey,然后输出数据即可,这里也不多说了,大家直接看代码吧。
private static void compress() {
FileOutputStream fos;
CheckedOutputStream cos ;
ZipOutputStream zos ;
BufferedOutputStream bos;
try {
fos = new FileOutputStream("./dir/demo.zip");
cos = new CheckedOutputStream(fos,new Adler32());
zos = new ZipOutputStream(cos);
bos = new BufferedOutputStream(zos);
zos.setComment("this is comment message");
for (String s : path) {
BufferedReader bufferedReader = new BufferedReader(new FileReader(s));
zos.putNextEntry(new ZipEntry(s));
int c;
while ((c = bufferedReader.read()) != -1){
bos.write(c);
}
bufferedReader.close();
bos.flush();
}
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
我们只需要通过ZipInputStream.getNextEntry的方法把每一个文件度出来即可,
private static void uncompress() {
FileInputStream fis;
try {
fis = new FileInputStream("./dir/demo.zip");
CheckedInputStream cis = new CheckedInputStream(fis,new Adler32());
ZipInputStream zis = new ZipInputStream(cis);
BufferedInputStream bis = new BufferedInputStream(zis);
ZipEntry zipENtry ;
while ((zipENtry = zis.getNextEntry()) != null){
System.err.println("read file--->" + zipENtry);
int x;
while ((x = bis.read()) != -1){
System.err.println(x);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
这是本文的高逼格,但是限制缺比较多,目前window是不能用的(不装环境的话),笔者是在ubuntu14.04 的系统上,所以,可以好好和你们装b一下了。
我们可以通过执行命令的方式来达到压缩和解压的目的。
以简单的命令为例,复杂的朋友们自己去研究下吧,
举个小小的例子
public static void main(String[] args){
String systemType = System.getProperty("os.name");
Runtime runtime = Runtime.getRuntime();
compress(runtime);
uncompress(runtime);
}
private static void compress(Runtime runtime){
try {
Process p = runtime.exec("zip ./dir/zip/demo.zip ./1.txt ./2.txt");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(p.getInputStream(),"utf-8"));
String s ;
while ((s=bufferedReader.readLine()) != null){
System.err.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void uncompress(Runtime runtime){
try {
Process p = runtime.exec("unzip ./dir/zip/demo.zip -d ./dir/unzip/");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(p.getInputStream(),"utf-8"));
String s ;
while ((s=bufferedReader.readLine()) != null){
System.err.println(s);
}
} catch (Exception e){
e.printStackTrace();
}
}
我们看下控制台的输出。
gzip我不想多说了,这个玩意有点坑。我喜欢在终端这样输入。
gzip -c wenjina > 压缩后
但是,这这命令用Runtime来执行是不支持的。因为-c会输出成标准流,java中也是有标准流的,所以,我只好用
gzip 文件
来进行压缩,
gunzip wenjian.gz
来进行解压了。好了,今天的b就装到这里。额 不对,今天就学习到这里,我会把相关的文件push到我的JavaNote,喜欢的同学star一下吧。