如果用一般的文件流操作來解壓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;
}
});
}
}
