파일을 압축/해동하기 좋은 Java 라이브러리는 무엇입니까?
JDK와 Apache 압축 libs와 함께 제공되는 기본 Zip 라이브러리를 살펴보았는데, 다음과 같은 세 가지 이유로 만족하지 못합니다.
그들은 비대하고 API 설계가 나쁘다.50줄의 보일러 플레이트 바이트 어레이 출력, zip 입력, 파일 아웃 스트림, 관련 스트림을 닫고 예외를 포착하고 바이트 버퍼를 직접 이동해야 합니까?왜 이렇게 간단한 API를 사용할 수 없는 거죠?
Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)
그리고.Zipper.zip(File targetDirectory, String password = null)
그냥 되는 거야?압축을 풀면 파일 메타데이터가 파괴되고 패스워드 처리가 깨지는 것 같습니다.
또한 UNIX에서 사용하는 명령줄 zip 툴에 비해 모든 라이브러리가 2~3배 느렸습니다.
저에게 (2)와 (3)은 사소한 점이지만, 저는 한 줄의 인터페이스를 갖춘 테스트 완료 라이브러리를 정말 원합니다.
늦은 시간이라 답변이 많지만 이 zip4j는 제가 사용한 최고의 지퍼링 라이브러리 중 하나입니다.심플하고(보일러 코드 없음), 패스워드로 보호된 파일을 간단하게 처리할 수 있습니다.
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.core.ZipFile;
public static void unzip(){
String source = "some/compressed/file.zip";
String destination = "some/destination/folder";
String password = "password";
try {
ZipFile zipFile = new ZipFile(source);
if (zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
zipFile.extractAll(destination);
} catch (ZipException e) {
e.printStackTrace();
}
}
Maven 의존관계는 다음과 같습니다.
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
Java 8에서는 Apache Commons-IO를 사용하여 다음을 수행할 수 있습니다.
try (java.util.zip.ZipFile zipFile = new ZipFile(file)) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
File entryDestination = new File(outputDir, entry.getName());
if (entry.isDirectory()) {
entryDestination.mkdirs();
} else {
entryDestination.getParentFile().mkdirs();
try (InputStream in = zipFile.getInputStream(entry);
OutputStream out = new FileOutputStream(entryDestination)) {
IOUtils.copy(in, out);
}
}
}
}
아직 상용 코드이지만 예외적이지 않은 종속성은 Commons-IO 하나뿐입니다.
Java 11 이상에서는 더 나은 옵션을 사용할 수 있습니다. Zeka Kozlov의 의견을 참조하십시오.
JDK만 사용하여 zip 파일과 모든 하위 폴더를 추출합니다.
private void extractFolder(String zipFile,String extractFolder)
{
try
{
int BUFFER = 2048;
File file = new File(zipFile);
ZipFile zip = new ZipFile(file);
String newPath = extractFolder;
new File(newPath).mkdir();
Enumeration zipFileEntries = zip.entries();
// Process each entry
while (zipFileEntries.hasMoreElements())
{
// grab a zip file entry
ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
String currentEntry = entry.getName();
File destFile = new File(newPath, currentEntry);
//destFile = new File(newPath, destFile.getName());
File destinationParent = destFile.getParentFile();
// create the parent directory structure if needed
destinationParent.mkdirs();
if (!entry.isDirectory())
{
BufferedInputStream is = new BufferedInputStream(zip
.getInputStream(entry));
int currentByte;
// establish buffer for writing file
byte data[] = new byte[BUFFER];
// write the current file to disk
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream dest = new BufferedOutputStream(fos,
BUFFER);
// read and write until last byte is encountered
while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch (Exception e)
{
Log("ERROR: "+e.getMessage());
}
}
Zip 파일 및 모든 하위 폴더:
private void addFolderToZip(File folder, ZipOutputStream zip, String baseName) throws IOException {
File[] files = folder.listFiles();
for (File file : files) {
if (file.isDirectory()) {
addFolderToZip(file, zip, baseName);
} else {
String name = file.getAbsolutePath().substring(baseName.length());
ZipEntry zipEntry = new ZipEntry(name);
zip.putNextEntry(zipEntry);
IOUtils.copy(new FileInputStream(file), zip);
zip.closeEntry();
}
}
}
다른 옵션은 maven central과 프로젝트 페이지(https://github.com/zeroturnaround/zt-zip에서 zt-zip을 이용할 수 있습니다.
표준 패킹 및 언팩 기능(스트림 및 파일 시스템)과 아카이브 내의 파일을 테스트하거나 엔트리를 추가/삭제하는 많은 도우미 방법을 갖추고 있습니다.
zip4j를 사용하여 폴더/파일을 압축/해동하기 위한 완전한 구현
이 종속성을 빌드 관리자에 추가합니다.또는 여기에서 최신 JAR 파일을 다운로드하여 프로젝트 빌드 경로에 추가합니다.그class
는 패스워드 모든 를 압축 및 할 수 .
import java.io.File;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import net.lingala.zip4j.core.ZipFile;
public class Compressor {
public static void zip (String targetPath, String destinationFilePath, String password) {
try {
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (password.length() > 0) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(password);
}
ZipFile zipFile = new ZipFile(destinationFilePath);
File targetFile = new File(targetPath);
if (targetFile.isFile()) {
zipFile.addFile(targetFile, parameters);
} else if (targetFile.isDirectory()) {
zipFile.addFolder(targetFile, parameters);
} else {
//neither file nor directory
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void unzip(String targetZipFilePath, String destinationFolderPath, String password) {
try {
ZipFile zipFile = new ZipFile(targetZipFilePath);
if (zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
zipFile.extractAll(destinationFolderPath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**/ /// for test
public static void main(String[] args) {
String targetPath = "target\\file\\or\\folder\\path";
String zipFilePath = "zip\\file\\Path";
String unzippedFolderPath = "destination\\folder\\path";
String password = "your_password"; // keep it EMPTY<""> for applying no password protection
Compressor.zip(targetPath, zipFilePath, password);
Compressor.unzip(zipFilePath, unzippedFolderPath, password);
}/**/
}
사용 방법에 대한 자세한 내용은 여기를 참조하십시오.
아주 멋진 프로젝트는 TrueZip입니다.
TrueZIP은 Java 기반의 가상 파일 시스템(VFS)용 플러그인 프레임워크로 단순한 디렉토리처럼 아카이브 파일에 투과적으로 액세스할 수 있습니다.
예를 들어 (웹 사이트에서):
File file = new TFile("archive.tar.gz/README.TXT");
OutputStream out = new TFileOutputStream(file);
try {
// Write archive entry contents here.
...
} finally {
out.close();
}
또 다른 옵션은 JZlib입니다.지금까지의 경험으로는, zip4J보다 파일 중심이 적기 때문에, 파일이 아닌 메모리내의 블러브에 대해 작업할 필요가 있는 경우는, 검토해 주세요.
파일 압축 및 압축 해제의 완전한 예는 다음과 같습니다.http://developer-tips.hubpages.com/hub/Zipping-and-Unzipping-Nested-Directories-in-Java-using-Apache-Commons-Compress
http://commons.apache.org/vfs/에 접속하셨나요?많은 것을 심플하게 할 수 있습니다.하지만 프로젝트에 써본 적은 없어요.
JDK 또는 Apache Compression 이외의 Java-Native 압축 libs도 인식하지 않습니다.
Apache Ant에서 몇 가지 기능을 삭제한 것을 기억합니다.압축/압축 해제 기능이 많이 내장되어 있습니다.
VFS를 사용한 샘플코드는 다음과 같습니다.
File zipFile = ...;
File outputDir = ...;
FileSystemManager fsm = VFS.getManager();
URI zip = zipFile.toURI();
FileObject packFileObject = fsm.resolveFile(packLocation.toString());
FileObject to = fsm.toFileObject(destDir);
FileObject zipFS;
try {
zipFS = fsm.createFileSystem(packFileObject);
fsm.toFileObject(outputDir).copyFrom(zipFS, new AllFileSelector());
} finally {
zipFS.close();
}
언급URL : https://stackoverflow.com/questions/9324933/what-is-a-good-java-library-to-zip-unzip-files
'programing' 카테고리의 다른 글
C 포인터를 NULL로 초기화할 수 있습니까? (0) | 2022.08.30 |
---|---|
C 포인터에서 어레이 크기를 가져오려면 어떻게 해야 합니까? (0) | 2022.08.30 |
VueJ는 프로포트를 데이터 속성 가치로 사용 (0) | 2022.08.30 |
Vue.js vue-router:페이지를 새로고침하지 않고 되돌아가려면 어떻게 해야 합니까? (0) | 2022.08.29 |
ISO C90은 C에서 선언과 코드가 혼재하는 것을 금지합니다. (0) | 2022.08.29 |