Java基础之-压缩与解压

来源:互联网 发布:js中树形菜单制作方法 编辑:程序博客网 时间:2024/06/05 18:23

0.Java中的压缩与解压

在Java的原生API里,只提供了ZIP和GZIP的压缩与解压。在本文中,除了用原生的API进行压缩与解压操作之外。小弟还将介绍一种比较酷炫的方法。通过Runtime执行命令来做。

1.Gzip压缩与解压

gzip压缩文件的后缀为.gz,gzip除了是一种压缩文件之外,还常常被用在网络传输中进行数据压缩。在Java中,GZIP针对的是单文件的压缩与解压。

如果想实现多文件压缩,需要先将文件压缩成tar,在将tar压缩为gz,这里就不说了。

1.1 Gzip压缩

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();        }    }

1.2 Gzip解压

额,同样解压就是包装一下普通流,废话不多说,直接上代码。

    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();        }    }

2.Zip压缩与解压

虽然说java原生api中gzip是对单文件(流)进行操作的,可是我们的zip缺能对多文件进行操作。并且Zip支持两种Checksum类来计算和校验文件的校验和方法,支持两种:

  • Adler32 速度稍微快点
  • CRC32 速度慢,但是更准确

2.1 zip的压缩

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();        }    }
  • 将输入流包装成BufferOutPutSteam流
  • 文件以ZipEntry put进去
  • 输入数据
  • 注意 一定要关闭流

2.2 zip解压

我们只需要通过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();        }    }

3.通过Runtime来压缩

这是本文的高逼格,但是限制缺比较多,目前window是不能用的(不装环境的话),笔者是在ubuntu14.04 的系统上,所以,可以好好和你们装b一下了。
我们可以通过执行命令的方式来达到压缩和解压的目的。

3.1 zip相关

以简单的命令为例,复杂的朋友们自己去研究下吧,

  • zip压缩命令 zip 压缩后文件路径 压缩文件的路径,如zip ./dir/zip/demo.zip ./1.txt ./2.txt
  • unzip解压 unzip 压缩文件 -d 解压后路径 如 unzip ./dir/zip/demo.zip -d ./dir/unzip

举个小小的例子

    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();        }    }

我们看下控制台的输出。
这里写图片描述

3.2 gzip相关

gzip我不想多说了,这个玩意有点坑。我喜欢在终端这样输入。

gzip -c wenjina > 压缩后

但是,这这命令用Runtime来执行是不支持的。因为-c会输出成标准流,java中也是有标准流的,所以,我只好用

gzip 文件 

来进行压缩,

gunzip wenjian.gz 

来进行解压了。好了,今天的b就装到这里。额 不对,今天就学习到这里,我会把相关的文件push到我的JavaNote,喜欢的同学star一下吧。

2 2
原创粉丝点击