[ Zip File System Provider ] [1]을 활용하여이를 달성 할 수 있다고 생각합니다 . 사용할 때 FileSystems.newFileSystem
해당 ZIP의 객체를 "일반"파일로 취급 할 수 있습니다.
위의 링크 된 문서에서 :
메소드에 전달 된 java.util.Map 오브젝트에서 zip 파일 시스템의 구성 옵션을 지정하십시오 FileSystems.newFileSystem
. zip 파일 시스템의 제공자 별 구성 특성에 대한 정보는 [Zip 파일 시스템 특성] [2] 주제를 참조하십시오.
zip 파일 시스템의 인스턴스가 있으면 [ java.nio.file.FileSystem
] [3] 및 [ java.nio.file.Path
] [4] 클래스 의 메소드를 호출하여 파일 복사, 이동 및 이름 바꾸기와 파일 오퍼레이션 수정과 같은 조작을 수행 할 수 있습니다.
jdk.zipfs
[Java 11 상태] [5] 의 모듈에 대한 설명서 :
zip 파일 시스템 제공자는 zip 또는 JAR 파일을 파일 시스템으로 취급하고 파일의 내용을 조작하는 기능을 제공합니다. zip 파일 시스템 제공자는 [ FileSystems.newFileSystem
] [6] (설치된 경우)으로 작성할 수 있습니다 .
다음은 예제 리소스를 사용하여 고안 한 예제입니다. a .zip
는 a .jar
이지만 클래스 경로 리소스를 대신 사용하도록 코드를 조정할 수 있습니다.
설정
cd /tmp
mkdir -p x/y/z
touch x/y/z/{a,b,c}.html
echo 'hello world' > x/y/z/d
zip -r example.zip x
자바
import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.Collections;
import java.util.stream.Collectors;
public class MkobitZipRead {
public static void main(String[] args) throws IOException {
final URI uri = URI.create("jar:file:/tmp/example.zip");
try (
final FileSystem zipfs = FileSystems.newFileSystem(uri, Collections.emptyMap());
) {
Files.walk(zipfs.getPath("/")).forEach(path -> System.out.println("Files in zip:" + path));
System.out.println("-----");
final String manifest = Files.readAllLines(
zipfs.getPath("x", "y", "z").resolve("d")
).stream().collect(Collectors.joining(System.lineSeparator()));
System.out.println(manifest);
}
}
}
산출
Files in zip:/
Files in zip:/x/
Files in zip:/x/y/
Files in zip:/x/y/z/
Files in zip:/x/y/z/c.html
Files in zip:/x/y/z/b.html
Files in zip:/x/y/z/a.html
Files in zip:/x/y/z/d
-----
hello world