Java: ZipFile с использованием пути

У меня есть Path zip-файл в виртуальной файловой системе (jimfs), и мне нужно открыть этот zip-файл с помощью ZipFile.

Но в ZipFile нет конструктора для получения Path в качестве аргумента, только File.

Однако я не могу создать из своего Path File (path.toFile()), потому что получаю UnsupportedOperationException. Как я могу открыть свой zip-файл с помощью ZipFile? Или, может быть, есть другие способы работы с zip-файлами, которых нет в файловой системе по умолчанию?


person Pavel_K    schedule 24.07.2016    source источник
comment
Использовать ZipFile(String) вместо этого?   -  person Yassin Hajaj    schedule 24.07.2016
comment
@Yassin Hajaj Я получаю FileNotFoundException, потому что он находит файл в файловой системе по умолчанию, а не в виртуальной.   -  person Pavel_K    schedule 24.07.2016


Ответы (2)


Класс ZipFile ограничен файлами в файловой системе.

Альтернативой может быть использование ZipInputStream вместо этого. Создайте InputStream из своего Path, используя

Path path = ...
InputStream in = Files.newInputStream(path, openOptions)

и используйте InputStream для создания ZipInputStream. Этот способ должен работать так, как ожидалось:

ZipInputStream zin = new ZipInputStream(in)

Поэтому рекомендуемый способ его использования:

try (ZipInputStream zin = new ZipInputStream(Files.newInputStream(path))) {
    // do something with the ZipInputStream
}
person Robert    schedule 24.07.2016

Взгляните на этот вопрос - там есть код, который создает новую файловую систему из содержимого из zip-файла:

  • взять Путь почтового индекса
  • преобразовать путь в URI
  • создать новую файловую систему для URI
person Nazarii Bardiuk    schedule 24.07.2016
comment
Я это знаю - создание zip файловой системы. Впрочем, мне это не нужно. У меня есть виртуальная система и zip-файл. И мне нужно только скопировать файл из этого zip-файла. - person Pavel_K; 24.07.2016
comment
Выглядит сложно. Что если бы вы могли использовать FileSystemProvider для копирования файла из одного пути в другой docs.oracle.com/javase/7/docs/ API/java/nio/файл/spi/ - person Nazarii Bardiuk; 24.07.2016
comment
Я думаю, что это решение должно работать, даже если zip-файл уже получен из другой файловой системы, отличной от используемой по умолчанию. Я думаю, что это, возможно, единственный способ получить произвольный доступ. Во всяком случае, не прибегая к Commons Compress. - person Trejkaz; 14.05.2018