I tested all possible options and permutations, but I cannot build a FileSystemProvider using the zip / jar scheme for a path (URI) that contains spaces. There is a very simplified test available in Oracle Docs . I let the example change and just add spaces to the URI, and it stops working. The snapshot below:
import java.util.*; import java.net.URI; import java.nio.file.*; public class Test { public static void main(String [] args) throws Throwable { Map<String, String> env = new HashMap<>(); env.put("create", "true"); URI uri = new URI("jar:file:/c:/dir%20with%20spaces/zipfstest.zip"); Path dir = Paths.get("C:\\dir with spaces"); if(Files.exists(dir) && Files.isDirectory(dir)) { try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {} } } }
When I execute this code (Windows, JDK7u2, both x32 and x64), I get the following exception:
java.lang.IllegalArgumentException: Illegal character in path at index 12: file:/c:/dir with spaces/zipfstest.zip at com.sun.nio.zipfs.ZipFileSystemProvider.uriToPath(ZipFileSystemProvider.java:87) at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:107) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:322) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:272)
If I use + instead of% 20 as a space escape character, another exception is thrown:
java.nio.file.NoSuchFileException: c:\dir+with+spaces\zipfstest.zip at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:229) at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430) at java.nio.file.Files.newOutputStream(Files.java:170) at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:116) at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:322) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:272)
I might have missed something very obvious, but would this indicate a problem with the provided ZIP / JAR file system provider?
EDIT:
Another use case based on a File object, as requested in the comments:
import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URI; import java.nio.file.FileSystems; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class Test { public static void main(String[] args) throws UnsupportedEncodingException { try { File zip = new File("C:\\dir with spaces\\file.zip"); URI uri = URI.create("jar:" + zip.toURI().toURL()); Map<String, String> env = new HashMap<>(); env.put("create", "true"); if(zip.getParentFile().exists() && zip.getParentFile().isDirectory()) { FileSystems.newFileSystem(uri, env); } } catch (Exception ex) { Logger.getAnonymousLogger().log(Level.SEVERE, null, ex); System.out.println(); } } }
The exception is repeated as:
java.lang.IllegalArgumentException: Illegal character in path at index 12: file:/C:/dir with spaces/file.zip at com.sun.nio.zipfs.ZipFileSystemProvider.uriToPath(ZipFileSystemProvider.java:87) at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:107) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:322) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:272)