-----------------------------
ѹËõËã·¨ |
-----------------------------
ZipOutputStream
ZipInputStream
GZIPOutputStream
GZIPInputStream
-----------------------------
zipѹËõÓë½âѹËõ
-----------------------------
/**
* ½âѹÎļþ
* @param file ѹËõÎļþ
* @param targetDir ½âѹÎļþÊä³öµÄĿ¼
* @throws IOException
*/
public static void unPacket(Path file, Path targetDir) throws IOException {
if (!Files.exists(targetDir)) {
Files.createDirectories(targetDir);
}
// ´´½¨zip¶ÔÏó
ZipFile zipFile = new ZipFile(file.toFile());
try {
// ¶ÁÈ¡zipÁ÷
try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file))){
ZipEntry zipEntry = null;
// ±éÀúÿһ¸özipÏî
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
// »ñÈ¡zipÏîÄ¿Ãû³Æ
String entryName = zipEntry.getName();
// ¹¹½¨¾ø¶Ô·¾¶
Path entryFile = targetDir.resolve(entryName);
if(zipEntry.isDirectory()) { // Îļþ¼Ð
if (!Files.isDirectory(entryFile)) {
Files.createDirectories(entryFile);
}
} else { // Îļþ
// ¶ÁÈ¡zipÏîÊý¾ÝÁ÷
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();
}
}
/**
* ѹËõÖ¸¶¨µÄÎļþ
* @param files Ä¿±êÎļþ
* @param zipFile Éú³ÉµÄѹËõÎļþ
* @throws IOException
*/
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);
// ÉèÖÃ×¢ÊÍ
zipOutputStream.setComment("ÎÒÊÇ×¢ÊÍ");
// дÈëÊý¾Ý
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();
}
}
/**
* ѹËõÖ¸¶¨µÄĿ¼
* @param folder
* @param zipFile
* @throws IOException
*/
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 path = new LinkedList<>();
try {
Files.walkFileTree(folder, new FileVisitor() {
@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();
}
}
------------------------------------------
GIZѹËõ/½âѹËõ |
------------------------------------------
/**
* ѹËõ
* @param data
* @return
* @throws IOException
*/
public static byte[] gZip(byte[] data) throws IOException {
byte[] bytes = null;
ByteArrayOutputStream byteArrayOutputStream = null;
GZIPOutputStream gzipOutputStream = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(data);
gzipOutputStream.finish();
bytes = byteArrayOutputStream.toByteArray();
} finally {
}
return bytes;
}
/**
* ½âѹËõ
* @param data
* @return
* @throws IOException
*/
public static byte[] unGZip(byte[] data) throws IOException {
byte[] bytes = null;
ByteArrayInputStream byteArrayInputStream = null;
GZIPInputStream gzipInputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
byteArrayInputStream = new ByteArrayInputStream(data);
gzipInputStream = new GZIPInputStream(byteArrayInputStream);
byte[] buf = new byte[1024];
int num = -1;
byteArrayOutputStream = new ByteArrayOutputStream();
while ((num = gzipInputStream.read(buf, 0, buf.length)) != -1)
{
byteArrayOutputStream.write(buf, 0, num);
}
bytes = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.flush();
} finally {
byteArrayInputStream.close();
gzipInputStream.close();
byteArrayOutputStream.close();
}
return bytes;
}
------------------------------------------
ѹËõ·þÎñÆ÷É϶à¸öÎļþ£¬ÏìÓ¦¸ø¿Í»§¶Ë
------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/download")
public class DownloadController {
@GetMapping
public void download(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("folder") String folder) throws UnsupportedEncodingException {
Path folderPath = Paths.get(folder);
if (!Files.isDirectory(folderPath)) {
// Îļþ¼Ð²»´æÔÚ
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return ;
}
// ¶þ½øÖÆÊý¾ÝÁ÷
response.setContentType("application/octet-stream");
// ¸½¼þÐÎʽ´ò¿ª
response.setHeader("Content-Disposition", "attachment; filename=" + new String((folderPath.getFileName().toString() + ".zip").getBytes("GBK"),"ISO-8859-1"));
try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())){
LinkedList path = new LinkedList<>();
Files.walkFileTree(folderPath, new FileVisitor() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
// ¿ªÊ¼±éÀúĿ¼
if (!dir.equals(folderPath)) {
path.addLast(dir.getFileName().toString());
// дÈëĿ¼
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;
// 10kb»º³åÇø
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();
} catch (IOException e) {
e.printStackTrace();
}
}
}