2014-11-22 17 views
6

Ich versuche, ein FileSystem Objekt zu erstellen, um ein ext2-Dateisystem zu halten. Meine URI scheint ungültig zu sein, geben Sie mir eine Pfadkomponente sollte '/' Laufzeitfehler sein.Pfadkomponente sollte '/' sein

Ich verwende Windows und habe mein Projekt in Eclipse, mit einem Unterverzeichnis namens "fs", das das Dateisystem-Image enthält.

Mein Code ...

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 */ 
} 

Ich habe das Dateisystem als File Objekt und verwendet, um die getURI Methode geladen meine URI ist das gleiche wie die tatsächlichen URI, um sicherzustellen, und es ist.

Wie kann ich das Dateisystem geladen bekommen?

EDIT:

-Stack-Trace

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

haben Sie versucht, 'file: //' (die das Protokoll) vor dem Pfad '/ C:/...', wodurch 'file : /// C:/... '? –

+0

Das Ändern gab mir den genau gleichen Fehler :( – user155410

+0

Was ist mit dem Hinzufügen von '/' an das Ende des URI? Wenn ext2 der Mount-Punkt ist, würde ich erwarten, dass es einen Pfad danach benötigt, so 'file:/C :/Users/Rosetta/workspace/filesystemProject/fs/ext2/' –

Antwort

4

Warum nicht ein Path-Objekt verwenden?

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

Beachten Sie die drei Konstrukteure:

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

Ich habe das zuerst versucht, aber ich habe keine Ahnung, was ein' ClassLoader' ist oder wie Wie benutze ich einen 'ClassLoader' mit der ersten Methode, um ein' FileSystem' zu erhalten? – user155410

4

Die Checks WindowsFileSystemProvider, dass der Weg nur URI ist '/'. Die URL ist perfekt als URI gültig, das Problem sind die Anforderungen des FileSystems. Crashystar hat es richtig (ich kann noch nichts sagen) und ein Pfad sollte verwendet werden. Wenn Sie die JavaDoc von newFileSystem (Path, Classloader) gelesen werden Sie die Classloader sehen bei null belassen werden, so brauchen Sie nur

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

Durch sie auf null zu tun verlassen Java versucht, einen installierten Provider zu lokalisieren (Sie können also nicht erwarten, dass ein benutzerdefinierter Anbieter verwendet wird). Wenn es sich um einen benutzerdefinierten Anbieter handelt, müssen Sie einen ClassLoader verwenden, der diesen Anbieter lädt. Wenn der Provider auf Ihrem Classpath ist, würde es ausreichen,

getClass().getClassLoader() 

zu tun, da Sie sagen, Sie nur das Betriebssystem das tun wollen, lassen Sie es auf null.

1

Sie können dies versuchen:

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

Ich fand das hilfreich, weil mein Uri dazu verwendet wird, eine JAR-Datei zu extrahieren.Ich weiß nicht, was passiert, wenn ein zipFileSystem ist in einem normalen Ordner geöffnet. –

1

Das ist für mich unter Windows gearbeitet. Haben sie noch nicht in anderen OS testeten

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 
} 
Verwandte Themen