// 引入包
import org.slf4j.LoggerFactory
import java.io.*
import java.nio.charset.Charset
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
// 工具类
class ZipUtils {
private var log = LoggerFactory.getLogger(ZipUtils::class.java)
@Test
fun mainTest() {
var zipFilePath: String = "D:\\TEST\\***.zip"
var desDirectory: String = "D:\\TEST\\unzip"
unzip(zipFilePath, desDirectory)
}
//========================解压===START===================================
/**
* 解压文件
* 目前支持范围:无文件夹压缩包和带文件夹压缩包
*/
private fun unzip(zipFilePath: String, desDirectory: String) {
var desDir = File(desDirectory)
if (!desDir.exists()) {
var mkdirSuccess = desDir.mkdir();
if (!mkdirSuccess) {
throw Exception("创建解压目标文件夹失败")
}
}
// 读入流(第二个参数,处理压缩文件中文异常。如果没有中文,可以不写第二个参数)
var zipInputStream = ZipInputStream(FileInputStream(zipFilePath), Charset.forName("GBK"))
// 遍历每一个文件
var zipEntry = zipInputStream.nextEntry
while (zipEntry != null) {
log.info(zipEntry.toString())
var unzipFilePath = desDirectory + File.separator + zipEntry.name
if (zipEntry.isDirectory) {
// 直接创建(注意,不是使用系统的mkdir,自定义方法)
mkdir(File(unzipFilePath))
} else {
var file = File(unzipFilePath)
// 创建父目录(注意,不是使用系统的mkdir,自定义方法)
mkdir(file.parentFile)
// 写出文件
var bufferedOutputStream = BufferedOutputStream(FileOutputStream(unzipFilePath))
val bytes = ByteArray(1024)
var readLen: Int
// Java 与 Kotlin的不同之处,需要特别关注。
// while ((readLen = zipInputStream.read(bytes))!=-1){
while (zipInputStream.read(bytes).also { readLen = it } > 0) {
bufferedOutputStream.write(bytes, 0, readLen)
}
bufferedOutputStream.close()
}
zipInputStream.closeEntry()
zipEntry = zipInputStream.nextEntry
}
}
/**
* 创建文件夹
*/
private fun mkdir(file: File) {
if (null == file || file.exists()) {
return
} else {
file.parentFile.mkdir()
file.mkdir()
}
}
//========================解压===END===================================
//========================压缩===START=================================【实现压缩功能,未详细测试】
@Test
fun zipTestMain(){
var directory: String = "D:\\TEST\\unzip\\Audio_6.0.9089.1"
var zipFile: String = "D:\\TEST\\unzip\\Audio_6.0.9089.1.zip"
zipAll(directory, zipFile)
}
private fun zipAll(directory: String, zipFile: String) {
val sourceFile = File(directory)
ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use {
it.use {
zipFiles(it, sourceFile, "")
}
}
}
private fun zipFiles(zipOut: ZipOutputStream, sourceFile: File, parentDirPath: String) {
val data = ByteArray(2048)
for (f in sourceFile.listFiles()) {
if (f.isDirectory) {
val entry = ZipEntry(f.name + File.separator)
entry.time = f.lastModified()
entry.isDirectory
entry.size = f.length()
log.info("zip", "Adding Directory: " + f.name)
zipOut.putNextEntry(entry)
//Call recursively to add files within this directory
zipFiles(zipOut, f, f.name)
} else {
if (!f.name.contains(".zip")) { //If folder contains a file with extension ".zip", skip it
FileInputStream(f).use { fi ->
BufferedInputStream(fi).use { origin ->
val path = parentDirPath + File.separator + f.name
log.info("zip", "Adding file: $path")
val entry = ZipEntry(path)
entry.time = f.lastModified()
entry.isDirectory
entry.size = f.length()
zipOut.putNextEntry(entry)
while (true) {
val readBytes = origin.read(data)
if (readBytes == -1) {
break
}
zipOut.write(data, 0, readBytes)
}
}
}
} else {
zipOut.closeEntry()
zipOut.close()
}
}
}
}
}