java如何利用NIO压缩文件或文件夹
作者:刘瑾言
这篇文章主要介绍了java如何利用NIO压缩文件或文件夹问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
java利用NIO压缩文件或文件夹
package liu.cn.ixj.util; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class CompressUtils { private static ZipOutputStream zipOutputStream=null; private static ByteBuffer byteBuffer = ByteBuffer.allocate(1024); public static void main(String[] args) { try { zipOutputStream=new ZipOutputStream(new FileOutputStream(new File("E://aa.zip"))); toZip(new File("E:\\MyDownloads")); zipOutputStream.flush(); zipOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void toZip(File file){ if (file.isFile()){ try { zipOutputStream.putNextEntry(new ZipEntry(file.getAbsolutePath().substring(3,file.getAbsolutePath().length()))); FileChannel channel = new FileInputStream(file).getChannel(); while (true){ byteBuffer.clear(); int read = channel.read(byteBuffer); if (read==-1)break;; zipOutputStream.write(byteBuffer.array()); } channel.close(); zipOutputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); } }else { File[] files = file.listFiles(); if (files==null||files.length==0){ try { zipOutputStream.putNextEntry(new ZipEntry(file.getAbsolutePath().substring(3,file.getAbsolutePath().length())+"/")); zipOutputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); } }else { for (File file2:files) { toZip(file2); } } } } }
java.io包和java.nio包
Java中I/O相关的两个包是java.io和java.nio,它们的最重要的区别就是java.io里面的类是面向流的(stream oriented),java.nio里面的类是面向缓存的(buffer oriented)。
面向流意味着一次读取一个或者一些字节,然后处理这些字节,在读取和处理这些字节时当前线程是阻塞的,不能干其他事情。
面向缓存意味着把一些字节读到缓存里面,选择了读取的字节之后当前线程可以去做其他事情,以后再去处理缓存里面的字节也可以,也就是线程非阻塞。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。