javanionio2jimfs

Java: ZipFile using Path


I have a Path to zip file on virtual filesystem (jimfs) and I need to open this zip file using ZipFile.

But there is no constructor in ZipFile to get Path as argument, only File.

However, I can't create from my Path a File (path.toFile()) because I get UnsupportedOperationException. How can I open my zip file with ZipFile? Or maybe there are other ways of working with zip files which are not on default filesystem?


Solution

  • The ZipFile class is limited to files in the file-system.

    An alternative would be to use ZipInputStream instead. Create an InputStream from your Path using

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

    and the use the InputStream to create an ZipInputStream. This way should work as expected:

    ZipInputStream zin = new ZipInputStream(in)
    

    So the recommended way to use it is:

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

    Note that decompressing certain ZIP files using ZipInputStream will fail because of their ZIP structure. This is a technical limitation of the ZIP format and can't be solved. In such cases you have to create a temporary file in file-system or memory and use a different ZIP class like ZipFile.