Search code examples
javazipunzip

java zip filesystem reading zip entries


SO, from what I've gathered, one is supposed to be able to create a filesystem from a zip from java 7 and beyond. I'm trying this, the ultimate goal is to use the File object and access these files, just as if I accessed an unzipped file.

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class MainZipTest {

public static void main(String[] args) throws IOException, URISyntaxException {

    Map<String, String> env = new HashMap<>();
    env.put("read", "true");

    File file = new File("C:/pathtoazip/data.zip");
    URI uri = file.toURI();
    String path = "jar:" + uri;
    FileSystem fs = FileSystems.newFileSystem(URI.create(path), env);

    for (Path p : fs.getRootDirectories()) {
        System.out.println("root" + p);
        //says "/"
        System.out.println(new File(p.toString()).exists());
        for (File f : new File(p.toString()).listFiles())
            System.out.println(f.getAbsolutePath());
        //lists the contents of my c drive!
    }
    
    System.out.println(new File("somefile.txt").exists());
    System.out.println(fs.getPath("somefile.txt").toFile().exists());
    System.out.println(new File("/somefile.txt").exists());
    System.out.println(fs.getPath("/somefile.txt").toFile().exists());
}
}

it all prints "false". What am I doing wrong here? Or am I wrong in my assumption that I can access these files through the File object? If so, how does one access them?


Solution

  • Path was introduced as generalization of File (disk file). A Path can be inside a zip file, an URL, and more.

    You can use Files with Path for similar File functionality.

    for (Path p : fs.getRootDirectories()) {
        System.out.println("root: " + p);
        System.out.println(Files.exists(p));
        Files.list(p).forEach(f -> System.out.println(f.toAbsolutePath()));
    }
    

    Note that a Path, like from a zip will maintain its actual file system view (fs, the zip).

    So avoid File.