Я думаю, що ви можете скористатися [ Провайдером Zip-файлових систем ] [1], щоб досягти цього. При використанні FileSystems.newFileSystem
це виглядає так, що ви можете ставитися до об'єктів у цьому ZIP як до "звичайного" файлу.
У зв'язаній документації вище:
Вкажіть параметри конфігурації для zip-файлової системи в об’єкті java.util.Map, переданому FileSystems.newFileSystem
методу. Див. Розділ [Властивості файлової системи Zip] [2] для отримання інформації про властивості конфігурації для постачальника для zip-файлової системи.
Щойно у вас є екземпляр файлової системи 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
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);
}
}
}
Вихідні дані
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