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一下吧。
- Java基础之-压缩与解压
- java基础之zip(压缩、解压)
- java 压缩与解压
- java 压缩与解压
- Linux之压缩与解压
- 设计之压缩与解压
- java 中压缩与解压
- java压缩与解压文件
- Java文件解压与压缩
- java实现解压与压缩
- java压缩与解压压缩文件
- java文件压缩与解压
- java zip 压缩与解压
- Linux基础学习之压缩解压
- Java小程序之哈夫曼树与文件压缩和解压缩(三)文件解压篇
- iOS开发之压缩与解压文件
- LINUX之文件解压与压缩汇总
- Linux常用命令之压缩与解压命令
- android 图片的高斯模糊实现
- CodeForces 589F -- F. Gourmet and Banquet (二分 + 贪心)
- mvp(一)
- 62. Unique Paths
- Maven学习总结(八)——使用Maven构建多模块项目
- Java基础之-压缩与解压
- 反射类的普通方法
- Codeforces596C. Wilbur and Points
- java中线程池的几种实现方式
- BNU 1642 简单的图论问题? 最短路+BFS
- 【PHP】函数explode和split的区别
- 一道C语言笔试题解析,检查源代码中的错误
- 反射类的属性
- Java方法的学习