2014-11-22 11 views
6

Sto tentando di creare un oggetto FileSystem per contenere un file system ext2. Il mio URI sembra non essere valido, fornendomi un componente di percorso dovrebbe essere '/' errore di runtime.Il componente del percorso deve essere '/'

Sto usando Windows e ho il mio progetto in Eclipse, con una sottodirectory chiamata "fs" che contiene l'immagine del filesystem.

Il mio codice ...

URI uri = URI.create("file:/C:/Users/Rosetta/workspace/filesystemProject/fs/ext2"); 
/* uri holds the path to the ext2 file system itself */   

try { 
    FileSystem ext2fs = FileSystems.newFileSystem(uri, null); 
} catch (IOException ioe) { 
    /* ... code */ 
} 

ho caricato il file system come un oggetto File e usato il metodo getURI per assicurarsi che il mio URI è lo stesso come l'attuale URI, e lo è.

Come posso caricare il filesystem?

EDIT:

Stack trace sotto

Exception in thread "main" java.lang.IllegalArgumentException: Path component should be '/' 
    at sun.nio.fs.WindowsFileSystemProvider.checkUri(Unknown Source) 
    at sun.nio.fs.WindowsFileSystemProvider.newFileSystem(Unknown Source) 
    at java.nio.file.FileSystems.newFileSystem(Unknown Source) 
    at java.nio.file.FileSystems.newFileSystem(Unknown Source) 
+1

hai provato 'file: //' (che è il protocollo) davanti al percorso '/ C:/...', rendendo così 'file : /// C:/... '? –

+0

Modifica che mi ha dato esattamente lo stesso errore :( – user155410

+0

cosa dire dell'aggiunta di '/' alla fine dell'URI? Se ext2 è il punto di mount, mi aspetterei che abbia bisogno di un percorso dopo di esso, quindi 'file:/C :/Users/Rosetta/workspace/filesystemProject/fs/ext2/' –

risposta

4

Perché non utilizzare un oggetto Path?

newFileSystem(Path path, ClassLoader loader) 
Constructs a new FileSystem to access the contents of a file as a file system. 

Nota i tre costruttori:

static FileSystem newFileSystem(Path path, ClassLoader loader) 
Constructs a new FileSystem to access the contents of a file as a file system. 

static FileSystem newFileSystem(URI uri, Map<String,?> env) 
Constructs a new file system that is identified by a URI 

static FileSystem newFileSystem(URI uri, Map<String,?> env, ClassLoader loader) 
Constructs a new file system that is identified by a URI 
+1

Ho provato questo all'inizio ma non ho idea di cosa sia' ClassLoader' o come per usare uno. Come uso un 'ClassLoader' con il primo metodo per ottenere un' FileSystem'? – user155410

4

del WindowsFileSystemProvider controlla che il percorso del URI è soltanto '/'. L'uri è perfettamente valido come URI, il problema sono i requisiti di FileSystem. crashystar ha ragione (non posso ancora commentare) e dovrebbe essere usato un Path. Se leggete il JavaDoc di newFileSystem (Path, ClassLoader) vedrete il ClassLoader può essere lasciato al nulla, quindi basta fare

Path path = Paths.get("C:/Users/Rosetta/workspace/filesystemProject/fs/ext2"); 
FileSystem ext2fs = FileSystems.newFileSystem(path, null); 

lasciandola a nulla Java tenta di individuare un provider installato (quindi non ci si può aspettare che venga utilizzato un fornitore personalizzato). Se si trattava di un fornitore personalizzato, dovresti utilizzare un ClassLoader che può caricare quel provider. Se il provider è sul classpath, sarebbe sufficiente per fare

getClass().getClassLoader() 

Dal momento che si dice che si desidera solo il sistema operativo per farlo, lasciare a nulla.

1

si può provare questo:

URI uri = URI.create("jar:file:/C:/Users/Rosetta/workspace/filesystemProject/fs/ext2"); 
+0

Ho trovato utile questo perché il mio Uri è usato per estrarre un file jar. Non so cosa succede quando un file zipFile è aperto su una cartella normale. –

1

Questo ha funzionato per me su Windows. Non l'ho ancora testato su altri sistemi operativi

private void openZip(File runFile) throws IOException { 
    Map<String, String> env = new HashMap<>(); 
    env.put("create", "true"); 
    env.put("encoding", "UTF-8"); 
    System.out.println(runFile.toURI()); 
    Files.deleteIfExists(runFile.toPath()); 
    zipfs = FileSystems.newFileSystem(URI.create("jar:" + runFile.toURI().toString()), env); 
    //zipfs = FileSystems.newFileSystem(runFile.toPath(), getClass().getClassLoader()); //-----does not work 
    //zipfs = FileSystems.newFileSystem(URI.create("jar:file:/c:/Users/Siraj/Documents/AAAExport4.zip"), env); //---works 
}