# Java – 解压缩带有子目录的文件

> 原文： [https://howtodoinjava.com/java/io/unzip-file-with-subdirectories/](https://howtodoinjava.com/java/io/unzip-file-with-subdirectories/)

**Java 代码示例，它使用`java.util.zip`包从压缩的 zip 文件**中解压缩并提取文件。 在此示例中，代码打开一个 zip 文件并以与目录浏览类似的方式开始遍历这些文件。 如果找到目录条目，则创建目录。 如果找到文件条目，则写入解压缩的文件。

## 解压缩文件示例

```java
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Main 
{
	public static void main(String[] args) 
	{
		//Open the file 
		try(ZipFile file = new ZipFile("files.zip"))
		{
			FileSystem fileSystem = FileSystems.getDefault();
			//Get file entries
			Enumeration<? extends ZipEntry> entries = file.entries();

			//We will unzip files in this folder
			String uncompressedDirectory = "uncompressed/";
			Files.createDirectory(fileSystem.getPath(uncompressedDirectory));

			//Iterate over entries
			while (entries.hasMoreElements()) 
			{
				ZipEntry entry = entries.nextElement();
				//If directory then create a new directory in uncompressed folder
				if (entry.isDirectory()) 
				{
					System.out.println("Creating Directory:" + uncompressedDirectory + entry.getName());
					Files.createDirectories(fileSystem.getPath(uncompressedDirectory + entry.getName()));
				} 
				//Else create the file
				else 
				{
					InputStream is = file.getInputStream(entry);
					BufferedInputStream bis = new BufferedInputStream(is);
					String uncompressedFileName = uncompressedDirectory	+ entry.getName();
					Path uncompressedFilePath = fileSystem.getPath(uncompressedFileName);
					Files.createFile(uncompressedFilePath);
					FileOutputStream fileOutput = new FileOutputStream(uncompressedFileName);
					while (bis.available() > 0) 
					{
						fileOutput.write(bis.read());
					}
					fileOutput.close();
					System.out.println("Written :" + entry.getName());
				}
			}
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}
}

```

## 示例如何运作

下面列出的事情在上面的示例中依次发生。

1.  [`ZipFile`](https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html)对象表示`.zip`文件，并用于访问其信息。
2.  [`ZipEntry`](https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipEntry.html)类表示 zip 文件中的条目-文件或目录。
3.  每个`ZipEntry`实例都具有压缩和未压缩的大小信息，名称以及未压缩字节的输入流。
4.  使用[`InputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html)和[`BufferedInputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/BufferedInputStream.html)，我们将未压缩的字节读入字节缓冲区，然后使用[`FileOutputStream`](https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html)将其写入文件。
5.  继续这样做，直到处理完整个文件。

将我的问题放在评论部分。

学习愉快！