testSrc/org/jetbrains/jps/util/ZipUtil.groovy (50 lines of code) (raw):
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.jps.util
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
/**
* @author nik
*/
class ZipUtil {
static File extractToTempDir(File file) throws IOException {
File output = FileUtil.createTempDirectory("extracted")
extract(file, output, null)
return output
}
static def extract(final File file, File outputDir, FilenameFilter filenameFilter) throws IOException {
ZipFile zipFile = new ZipFile(file)
try {
final Enumeration entries = zipFile.entries()
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement()
final File entryFile = new File(outputDir, entry.getName())
if (filenameFilter == null || filenameFilter.accept(entryFile.getParentFile(), entryFile.getName())) {
extractEntry(entry, zipFile.getInputStream(entry), outputDir)
}
}
}
finally {
zipFile.close();
}
}
static def extractEntry(ZipEntry entry, final InputStream inputStream, File outputDir) throws IOException {
final boolean isDirectory = entry.isDirectory()
final String relativeName = entry.getName()
final File file = new File(outputDir, relativeName)
FileUtil.createParentDirs(file)
if (isDirectory) {
file.mkdir()
}
else {
final BufferedInputStream input = new BufferedInputStream(inputStream)
final BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file))
try {
final byte[] buffer = new byte[1024*20]
int len
while ((len = input.read(buffer)) >= 0) {
output.write(buffer, 0, len)
}
}
finally {
output.close()
input.close()
}
}
}
}