通俗易懂地教你用Java实现文件压缩

val array = ByteArray(8192)

var len: Int

while (ins.read(array).also { len = it } != -1) {

	zos.write(array, 0, len)

}

}




如上代码,从ins(InputStream)中读取文件内容,并使用zos(ZipOutputStream)写到文件中,写到文件中的内容就是压缩之后的内容,代码执行完成后,图形化界面如下:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509181824150.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)  

可以看到,上图压缩文件中的“压缩示例.txt”已经有了数据,压缩前大小为301.7KB,压缩后的大小为1.2KB,压缩率惊人啊!



就是这么简单,文件压缩我们就讲完了,接下来再来学习一些细节就很容易了



[]( )设置文件的修改时间

========================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509185432664.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)  

压缩的时候如果没有指定文件的修改时间,则会以系统当前的时间做为修改时间,我们希望和原文件的修改时间保持一致。



ZipEntry就代表了压缩文件里面的文件,所以要修改压缩文件里面的文件的信息时就可以找ZipEntry就行了。如下:



zipEntry.time = rawfile.lastModified()




当然,文件还有创建时间和访问时间,在文件上右击并选择属性即可查看,如下:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509195054383.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)  

百度了一下,这些属性是可以获取到的,JDK本身有提供这样的方法,如下:



BasicFileAttributes att = Files.readAttributes(p, BasicFileAttributes.class);

att.creationTime();

att.lastAccessTime();

att.lastModifiedTime();




但是这些方法在Android中被阉割掉了,也无所谓了,而且在Windows电脑上显示的时间也是修改时间,如下:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509185629854.png)  

就算不阉割这些方法也没有用,据说在lunix系统下创建的文件只有最后修改时间,是没有创建时间这个属性的(不知道是不是真的)。如果说有公司有要求一定要知道文件的创建时间,解决方案也很简单,在创建文件的时候,把当前时间加到文件名上即可。



[]( )设置压缩级别

=====================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/2020050918591071.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)  

如上图,压缩配置有速度最快、体积最小,如果选择自定义还会看到有存储、最快、较快、标准、较好、最好等级别,最好的意思是压缩的最厉害,压缩的文件最小,但是需要的压缩时间也是最长的,在代码中,写入压缩的数据是通过ZipOutputStream流来写的,所以这个类要知道压缩级别,找这个类上的方法即可,如下:



zipOutputStream.setLevel(Deflater.NO_COMPRESSION) // 无压缩

zipOutputStream.setLevel(Deflater.BEST_SPEED) // 最快的压缩

zipOutputStream.setLevel(Deflater.BEST_COMPRESSION) // 最好的压缩




setLevel接收的参数是int类型,取值范围是0 ~ 9,0是无压缩,就是可以把1个或几个文件打包到一个zip文件中,但是文件数据没有进行压缩,1 ~ 9就是压缩等级,9代表最好的压缩等级,需要的压缩时间也就最长。这个一般不用设置,用默认的就挺好了。我项目中使用了最好的压缩,因为我压缩的是一些日记文件,内容都不算大,虽然选了最了最好的压缩,但是时间也很快,压缩的小一些,时间是长了一点,但是上传的时间也快了一点。



[]( )设置压缩文件的注释

========================================================================



zipOutputStream.setComment(String comment)




效果如下:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509191343110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)  

为什么不写中文?因为会有中文乱码,怎么解决中文乱码呢,这个我懒得管了,公司也没要求要加这个,所以真实开发就是这样的,用到什么学什么,用不到的,不学也罢!



[]( )把多个文件压缩到一个文件中

============================================================================



zipOutputStream.putNextEntry(zipEntry)

zipOutputStream.write(bytes)

zipOutputStream.closeEntry()




关键就是putNextEntry就代表往压缩文件里放一个文件,然后write开始写入这个文件的内容,写完之后调用closeEntry,再来第二个文件时就重复一样的流程即可,完整示例如下:



fun main() {

val rawfile_1 = File("C:\\Users\\even\\Desktop\\logs\\压缩示例.txt")

val rawfile_2 = File("C:\\Users\\even\\Desktop\\logs\\Hello.txt")

val zipfile = File("C:\\Users\\even\\Desktop\\logs\\压缩示例.zip")

val rawFileList = listOf(rawfile_1, rawfile_2)



ZipOutputStream(zipfile.outputStream()).use { zos ->

    rawFileList.forEach { rawFile ->

        zos.putNextEntry(ZipEntry(rawFile.name))

        rawFile.inputStream().use { ins ->

            val array = ByteArray(8192)

            var len: Int

            while (ins.read(array).also { len = it } != -1) {

                zos.write(array, 0, len)

            }

        }

        zos.closeEntry()

    }

}

}




效果如下:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509193516796.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FuZHJvaWRfY2FpX25pYW8=,size_16,color_FFFFFF,t_70)



[]( )递归压缩一个目录下的所有内容

=============================================================================



相信有了上面的基础知识,你要完成递归压缩一个目录下的所有内容,应该也是简简单单了,公司里没这需求,我也懒得写代码去实现了。



OK,就讲到这了,虽然类上面还有很多其他方法,但是对于我目前项目的需求来说已经够用了,我也懒得去研究那些方法干嘛用的,人生苦短,该懒的时候就要懒!



 



[



![](https://img-blog.csdnimg.cn/fce44ffe4f1f493b84f6e057060c9c93.png)



创作打卡挑战赛 ![](https://img-blog.csdnimg.cn/img_convert/dd37573f8d0f196b8c3b3fd7c02bada9.png)



赢取流量/现金/CSDN周边激励大奖







](https://mp.csdn.net/activity/newclock?utm_campaign=marketingcard&utm_source=android_cai_niao&utm_content=106024732)



# 最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

![](https://img-blog.csdnimg.cn/img_convert/85925e911bd943a524722cb177886253.webp?x-oss-process=image/format,png)

大厂面试真题:

![](https://img-blog.csdnimg.cn/img_convert/73a63f9ea758d97294dc842d8651a6fe.webp?x-oss-process=image/format,png)



](https://mp.csdn.net/activity/newclock?utm_campaign=marketingcard&utm_source=android_cai_niao&utm_content=106024732)



# 最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

[外链图片转存中...(img-80qO5ylA-1721201038364)]

大厂面试真题:

[外链图片转存中...(img-oDFS6nL8-1721201038364)]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值