分享(非充分)利用NIO2进行压缩处理的代码
2014-11-23 01:42
211 查看
这几天帮女友做的程序需要用到zip打包压缩的功能。
又正好在研究NIO2,好吧...确实是很古老的东西了...
不过在网上找了一些文章以后,发现内容更古老...
于是想自己更新一下内容,看看NIO2可以对程序做出一些什么样的变化。
代码中没有用到强大的walkFileTree,用DirectoryStream的递归实现,之后有时间的话,再去研究下walkFileTree。
有什么可以优化的地方,也希望各位不吝赐教。
又正好在研究NIO2,好吧...确实是很古老的东西了...
不过在网上找了一些文章以后,发现内容更古老...
于是想自己更新一下内容,看看NIO2可以对程序做出一些什么样的变化。
代码中没有用到强大的walkFileTree,用DirectoryStream的递归实现,之后有时间的话,再去研究下walkFileTree。
有什么可以优化的地方,也希望各位不吝赐教。
package com.task; import java.io.File; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipProcess { private static ZipOutputStream zos; static Path pathRoot = Paths.get("C:" + File.separator + "scan" /* + File.separator + "a.pdf" */); public static void zipProcess(Path path) throws IOException { pathRoot = path; System.out.println("需要压缩的路径是:" + pathRoot.toString()); /* * 首先,传进来一个path参数,这个参数表达着我们所要压缩的对象 可以是一个文件,也可以是一个文件夹 * 如果是文件的话,只需要将扩展名转变为.zip即可 如果是文件夹的话,只需要在PATH路径后,增加.zip即可。 * 生成的字符串,用作ZipEntry */ StringBuilder sb = new StringBuilder(); if (!Files.isDirectory(pathRoot)) { String[] tempString = pathRoot.toString().split("\\."); // 因为.在正则表达式中,代表任意字符,所以要使用"."时,需要转义 for (int i = 0; i < tempString.length - 1; i++) { sb.append(tempString[i]); } } else { sb.append(pathRoot.toString());// 如果pathRoot是文件夹 } String zosName = sb.append(".zip").toString(); // 至此,zos已经获得了。 zos = new ZipOutputStream(Files.newOutputStream(Paths.get(zosName))); // 接下来做判断,是否是文件 // 1、如果是文件 if (!Files.isDirectory(pathRoot)) { // 把文件名作为zipEntry添加进Zip文件 System.out.println("xxx:" + pathRoot.getFileName().toString()); zos.putNextEntry(new ZipEntry(pathRoot.getFileName().toString())); zosReadAndWrite(pathRoot);// 多亏Files的readAllBytes方法,不需要再有InputStream去读字节了。 } // 2、如果是路径的话,就获取DirectoryStream,做遍历 else { checkAndWrap(pathRoot); } // 确定了输出流,设定完了ZIP文件的根位置以后,就开始对路径做DirectoryStream // 传根位置进方法,做递归:如果该位置为文件,做ZipEntry的增加,并且做相应的ZipOutputStream的write操作。 // 以下是ZipEntry的标准获取格式。 System.out.println(); zos.close(); } private static void zosReadAndWrite(Path in) throws IOException { zos.write(Files.readAllBytes(in)); } private static void checkAndWrap(Path pRoot) throws IOException { // 能够传进来的参数,一定是指定路径的,那么,第一步就是获取DirectoryStream了 try (DirectoryStream<Path> ds = Files.newDirectoryStream(pRoot)) { try (DirectoryStream<Path> dsTemp = Files.newDirectoryStream(pRoot)) { if (!dsTemp.iterator().hasNext()) { zos.putNextEntry(new ZipEntry(pathRoot.relativize(pRoot) .toString() + "/")); // 如果是空文件夹,只需要putNextEntry即可。结尾需要加"/"。 } else { for (Path p : ds) { if (Files.isDirectory(p)) { checkAndWrap(p); } else { zos.putNextEntry(new ZipEntry(pathRoot .relativize(p).toString())); zosReadAndWrite(p); } } } } } } }
相关文章推荐
- 批处理利用winrar进行多重压缩和解压
- python-利用pyaudio进行声音录制及简单实例代码分享
- 利用c#自带的类对文件进行压缩和解压处理
- 开源社区里利用JTS库进行空间处理的代码参考
- 在resin服务器上使用gzip页面压缩及利用ant进行空行处理
- python使用pil进行图像处理(等比例压缩、裁剪)实例代码
- [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现
- 利用正则表达式获取特定文件(如java class)并对其进行处理(如代码统计)
- Ant---利用 Ant 和 JUnit 进行增量开发使用单元测试来逐步改进代码
- 利用xslt对xml进行缩进格式化处理
- 可再发行平台 SDK:CAPICOM ,对数据进行数字签名、对代码签名、验证数字签名、包封保密数据、对数据进行散列处理、加密及解密数据的SDK
- 利用SharpZipLib进行文件的压缩和解压缩
- 利用继承进行JAVA的代码重用
- [转贴]在C#中利用SharpZipLib进行文件的压缩和解压缩
- 利用单元测试在每个层上对PHP代码进行检查
- 在C#中利用SharpZipLib进行文件的压缩和解压缩(转)
- 怎么对数据库进行压缩处理
- 在C#中利用SharpZipLib进行文件的压缩和解压缩
- 在C#中利用SharpZipLib进行文件的压缩和解压缩
- 在C#中利用SharpZipLib进行文件的压缩和解压缩