1.代码示例
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
public static void unPacket(Path file, Path targetDir) throws IOException {
if (!Files.exists(targetDir)) {
Files.createDirectories(targetDir);
}
ZipFile zipFile = new ZipFile(file.toFile());
try {
try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file))){
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String entryName = zipEntry.getName();
Path entryFile = targetDir.resolve(entryName);
if(zipEntry.isDirectory()) {
if (!Files.isDirectory(entryFile)) {
Files.createDirectories(entryFile);
}
} else {
try(InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry)){
try(OutputStream fileOutputStream = Files.newOutputStream(entryFile, StandardOpenOption.CREATE_NEW)){
byte[] buffer = new byte[4096];
int length = 0;
while ((length = zipEntryInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, length);
}
fileOutputStream.flush();
}
}
}
}
}
} finally {
zipFile.close();
}
}
public static void packet(Path[] files, Path zipFile) throws IOException {
OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
try {
for (Path file : files) {
if (Files.isDirectory(file)) {
continue;
}
try (InputStream inputStream = Files.newInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(file.getFileName().toString());
zipOutputStream.putNextEntry(zipEntry);
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = inputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.flush();
}
}
zipOutputStream.closeEntry();
} finally {
zipOutputStream.close();
outputStream.close();
}
}
public static void packet(Path folder, Path zipFile) throws IOException {
if (!Files.isDirectory(folder)) {
throw new IllegalArgumentException(folder.toString() + " 不是合法的文件夹");
}
OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
LinkedList<String> path = new LinkedList<>();
try {
Files.walkFileTree(folder, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if (!dir.equals(folder)) {
String folder = dir.getFileName().toString();
path.addLast(folder);
ZipEntry zipEntry = new ZipEntry(path.stream().collect(Collectors.joining("/", "", "/")));
try {
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
try (InputStream inputStream = Files.newInputStream(file)) {
String fileName = path.size() > 0
? path.stream().collect(Collectors.joining("/", "", "")) + "/" + file.getFileName().toString()
: file.getFileName().toString();
ZipEntry zipEntry = new ZipEntry(fileName);
zipOutputStream.putNextEntry(zipEntry);
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = inputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (!path.isEmpty()) {
path.removeLast();
}
return FileVisitResult.CONTINUE;
}
});
zipOutputStream.closeEntry();
} finally {
zipOutputStream.close();
outputStream.close();
}
}
}