使用Java新特性來解壓zip文件


如果用一般的文件流操作來解壓zip文件,稍微會有點麻煩。JavaSE7的java.nio.file包新加了幾個新類,我們可以利用他們來簡化解壓過程。

zip文件名用String變量zipFile來表示。

1 定義一個zip文件的文件系統:

FileSystem fs = FileSystems.newFileSystem(Paths.get(zipFile), null);

 2 獲取當前目錄

final String currentPath = System.getProperty("user.dir");

 注意,因為稍后在匿名類中會用到變量currentPath,所以需要定義為final

3 利用Files的靜態方法walkFileTree遍歷整個zip文件系統,同時將文件拷貝到指定目錄

 

 3.1 調用getPath來獲取zip文件系統的根目錄

fs.getPath("/")

 3.2 new一個SimpleFileVisitor<Path>,便利文件系統時可獲取文件的屬性。

new SimpleFileVisitor<Path>() {
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

 3.3 獲取目的地址,其中Paths.get可將兩個合法的地址拼接為一個

Path destPath = Paths.get(currentPath, file.toString());

 3.4 如果目標文件已經存在,則刪除

Files.deleteIfExists(destPath);

 3.5 創建文件的父目錄,不管是文件isFile還是isDirectory,按照Linux文件系統的觀點,都可以用同一種方式來處理,即首先創建父目錄,然后創建文件(文件夾)。

Files.createDirectories(destPath.getParent());

 3.6 移動文件

Files.move(file, destPath);

 

完整代碼清單

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class Zipper {
	public static void main(String[] args) throws Exception {
		if (args.length == 0) {
			System.out.println("Usage: java Zipper zipfilename");
			System.exit(0);
		}

		unzip(args[0]);
	}

	public static void unzip(String zipFile) throws Exception {
		FileSystem fs = FileSystems.newFileSystem(Paths.get(zipFile), null);
		final String currentPath = System.getProperty("user.dir");
		System.out.println("current directory:" + currentPath);

		Files.walkFileTree(fs.getPath("/"), new SimpleFileVisitor<Path>() {
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				Path destPath = Paths.get(currentPath, file.toString());
				Files.deleteIfExists(destPath);
				Files.createDirectories(destPath.getParent());
				Files.move(file, destPath);
				return FileVisitResult.CONTINUE;
			}
		});
	}
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM