在Java中可以使用ZipOutputStream和ZipInputStream來實作zip的壓縮和解壓縮操作,另外使用FileSystem也可以用來實作zip的解壓縮,下面將介紹這幾種方式,直接上代碼,
zip壓縮
待壓縮檔案目錄結構:

每個zip檔案項都要對應一個ZipEntry,然后通過ZipOutputStream的putNextEntry方法開始寫入一個新的zip檔案項,將檔案資料發送到zip輸出流中,完成后再呼叫closeEntry方法,
@Test
public void testCompressByZip() {
try (
//指定壓縮完成后zip檔案的存盤路徑
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("F:\\myFavorites.zip"))
)
{
//待壓縮檔案/目錄所在的目錄
File fileFolder = new File("F:\\我的收藏");
//獲取目錄下的所有檔案
File[] files = fileFolder.listFiles();
ZipEntry zipEntry;
byte[] byteArray;
int len;
//遍歷目錄下的所有檔案/目錄,并將它們添加到壓縮檔案中
for (File file : files) {
//一個ZipEntry對應壓縮檔案中的一項
zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
try (FileInputStream in = new FileInputStream(file)) {
byteArray = new byte[1024];
while ((len = in.read(byteArray)) != -1) {
zipOutputStream.write(byteArray, 0, len);
}
} catch (IOException ex) {
ex.printStackTrace();
}
zipOutputStream.closeEntry();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
壓縮結果:

zip解壓縮
遍歷zip檔案中的所有項,并獲取對應項的輸入流,然后通過FileOutputStream輸出到指定目錄中,
@Test
public void testDecompressByZip() {
try (
//指定需要解壓縮的zip檔案
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("F:\\myFavorites.zip"))
)
{
ZipEntry zipEntry;
byte[] byteArray;
int len;
//遍歷zip檔案中的所有項,并逐個解壓到指定的目錄中
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\我的解壓目錄\\" + zipEntry.getName())) {
byteArray = new byte[1024];
while ((len = zipInputStream.read(byteArray)) != -1) {
fileOutputStream.write(byteArray, 0, len);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
解壓縮結果:

使用FileSystem解壓縮
- 建立一個檔案系統,包含zip檔案中的所有項,
- 遍歷zip檔案中的所有項,通過檔案訪問器SimpleFileVisitor將每個項復制到指定目錄中,
@Test
public void testDecompressByZip2(){
try {
//將壓縮檔案作為一個檔案系統訪問
FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\\myFavorites.zip"), null);
//遍歷壓縮檔案中的內容,并使用檔案訪問器訪問所有內容
Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("訪問目錄中檔案時呼叫");
//將檔案解壓到指定目錄
Files.copy(file, new FileOutputStream("F:\\我的解壓目錄\\" + file.getName(file.getNameCount() - 1)));
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("訪問目錄中檔案之前呼叫");
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("訪問目錄中檔案失敗時呼叫");
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("訪問目錄中的檔案及其所有后代之后呼叫");
return FileVisitResult.CONTINUE;
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263199.html
標籤:Java
上一篇:常用類
下一篇:spring(1)
