Я думаю, что вы можете использовать [ Zip File System Provider ] [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], если он установлен.
Вот надуманный пример, который я сделал, используя ваши примеры ресурсов. Обратите внимание, что .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