Tôi nghĩ bạn có thể tận dụng [ Nhà cung cấp hệ thống tệp Zip ] [1] để đạt được điều này. Khi đang sử dụngFileSystems.newFileSystem
có vẻ như bạn có thể coi các đối tượng trong ZIP đó là tệp "thông thường".
Trong các tài liệu liên kết ở trên:
Chỉ định các tùy chọn cấu hình cho hệ thống tệp zip trong đối tượng java.util.Map được truyền cho FileSystems.newFileSystem
phương thức. Xem chủ đề [Thuộc tính hệ thống tệp Zip] [2] để biết thông tin về các thuộc tính cấu hình dành riêng cho nhà cung cấp cho hệ thống tệp zip.
Khi bạn có một phiên bản của hệ thống tệp zip, bạn có thể gọi các phương thức của các lớp [ java.nio.file.FileSystem
] [3] và [ java.nio.file.Path
] [4] để thực hiện các thao tác như sao chép, di chuyển và đổi tên tệp, cũng như sửa đổi các thuộc tính tệp.
Tài liệu cho jdk.zipfs
mô-đun ở [trạng thái Java 11] [5]:
Nhà cung cấp hệ thống tệp zip coi tệp zip hoặc tệp JAR là một hệ thống tệp và cung cấp khả năng thao tác với nội dung của tệp. Nhà cung cấp hệ thống tệp zip có thể được tạo bởi [ FileSystems.newFileSystem
] [6] nếu được cài đặt.
Đây là một ví dụ giả định tôi đã sử dụng tài nguyên mẫu của bạn. Lưu ý rằng a .zip
là a .jar
, nhưng bạn có thể điều chỉnh mã của mình để sử dụng tài nguyên đường dẫn:
Thiết lập
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
Java
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);
}
}
}
Đầu ra
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