Java基础之-压缩与解压

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
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值