ฉันคิดว่าคุณสามารถใช้ประโยชน์จาก [ ผู้ให้บริการระบบไฟล์ Zip ] [1] เพื่อให้บรรลุเป้าหมายนี้ เมื่อใช้งานFileSystems.newFileSystem
ดูเหมือนว่าคุณสามารถจัดการวัตถุใน ZIP นั้นเป็นไฟล์ "ปกติ"
ในเอกสารที่เชื่อมโยงด้านบน:
ระบุตัวเลือกการกำหนดค่าสำหรับระบบไฟล์ zip ในวัตถุ java.util.Map ที่ส่งไปยัง FileSystems.newFileSystem
เมธอด ดูหัวข้อ [คุณสมบัติของระบบไฟล์ 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
คือ.jar
แต่คุณสามารถปรับรหัสของคุณเพื่อใช้ทรัพยากร classpath แทน:
ติดตั้ง
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