天天看點

Paths類結合FileSystem實作解壓zip檔案

Paths類會在預設檔案系統中查找路徑,即在使用者的本地磁盤中的檔案,但是也可以有别的檔案系統,比如ZIP檔案系統

FileSystem的一些方法:

abstract Iterable getFileStores()

abstract Path getPath(String first, String… more)

abstract Iterable getRootDirectories()

abstract String getSeparator()

abstract boolean isOpen()

abstract boolean isReadOnly()

abstract FileSystemProvider provider()

abstract Set supportedFileAttributeViews()

存在的問題:隻能周遊UTF-8格式,目前還不知道有什麼方法設定編碼格式

可以實作:對ZIP中檔案的複制(等價解壓)

解壓ZIP到指定位置;

//1.解壓zip檔案
public static void Unzip(String zipfile,String destDir) throws IOException {
    Path path=Paths.get(zipfile);
    final Path destPath=Paths.get(destDir);
    if (Files.notExists(path)) {
        throw new IOException("源檔案不存在");
    }
    if (Files.notExists(destPath)) {
        Files.createDirectories(destPath);
    }

    //擷取ZIP檔案系統,接受以 zip或jar結尾的檔案
    FileSystem fs=FileSystems.newFileSystem(Paths.get(zipfile),null);
    //周遊所有的檔案,預設隻能周遊UTF-8格式的
    Files.walkFileTree(fs.getPath("/"),new SimpleFileVisitor<Path>() {
        //按官方例子來說,這裡分開處理檔案夾,感覺沒有必要
//      @Override
//      public FileVisitResult preVisitDirectory(Path dir,
//          BasicFileAttributes attrs) throws IOException {
//          return null;}

        @Override //處理檔案
        public FileVisitResult visitFile(Path file,
            BasicFileAttributes attrs) throws IOException {
        Path target=Paths.get(destPath.toString(), file.toString());
        if (Files.notExists(target.getParent())) {
        Files.createDirectories(target.getParent());
        }
        Files.copy(file, target);
        return FileVisitResult.CONTINUE;
        }
    });
    }
     public static void main(String[] args) throws IOException{
//  Unzip("D:/壓縮/UTFtest.zip","D:/壓縮/111/11");
    }