2014-11-22 122 views
6

我試圖創建一個FileSystem對象來保存一個ext2文件系統。我的URI似乎是無效的,給我一個路徑組件應該是'/'運行時錯誤。路徑組件應該是'/'

我使用的是Windows,並在Eclipse中擁有我的項目,其中包含一個名爲「fs」的子目錄,用於保存文件系統映像。

我的代碼...

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

我已加載文件系統爲File對象和所使用的getURI方法,以確保我URI相同的實際URI,它是。

如何獲取文件系統加載?

編輯:下面

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

您是否在路徑'/ C:/ ...'前嘗試過'file://這是協議',從而使'file :/// C:/ ...'? – 2014-11-22 15:25:11

+0

改變,給了我完全相同的錯誤:( – user155410 2014-11-22 15:27:48

+0

如何在URI的末尾添加'/'?如果ext2是掛載點,我希望它需要一個路徑,所以'file:/ C :/ Users/Rosetta/workspace/filesystemproject/fs/ext2 /' – 2014-11-22 15:35:18

回答

4

堆棧跟蹤爲什麼不使用Path對象?

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

注意三個構造函數:

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

我一開始試過,但我不知道'ClassLoader'是什麼或是怎麼樣使用一個。我如何使用帶有第一種方法的'ClassLoader'來獲得'FileSystem'? – user155410 2014-11-22 16:04:24

4

的WindowsFileSystemProvider的檢查,該URI的路徑是唯一的 '/'。 URI作爲URI完全有效,問題在於FileSystem的必要條件。 crashystar有它的權利(我不能評論),應該使用一個路徑。 如果你讀newFileSystem(路徑,類加載器)的JavaDoc中您將看到的ClassLoader可以在空留,所以你只需要做

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

通過在空留的Java嘗試查找已安裝的供應商(所以你不能指望自定義提供者被使用)。如果它是一個自定義提供程序,則必須使用可加載該提供程序的ClassLoader。如果供應商是在classpath中,這將會是足夠的做

getClass().getClassLoader() 

既然你說你只想操作系統要做到這一點,把它在零。

1

你可以試試這個:

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

我發現這很有幫助,因爲我的Uri被用來提取一個jar文件。我不知道當zipFileSystem在普通文件夾中打開。 – 2017-01-06 09:44:15

1

這爲我工作在Windows上。還沒有在其他操作系統上進行過測試

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 
} 
相關問題