我想了解Java在創建File
對象時解析相對路徑的方式。Java如何在新File()中解析相對路徑?
OS使用:視窗
對於下面的代碼片段,我得到了IOException
,因爲它無法找到路徑:
@Test
public void testPathConversion() {
File f = new File("test/test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
我的理解這裏,爪哇將其視爲絕對回報提供的路徑路徑不存在時發生錯誤。所以這是有道理的。
當我更新了上面的代碼中使用相對路徑:
@Test
public void testPathConversion() {
File f = new File("test/../test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
它創建一個新的文件,並提供以下的輸出:
test\..\test.txt
C:\JavaForTesters\test\..\test.txt
C:\JavaForTesters\test.txt
在這種情況下,我的假設是,即使所提供的路徑不存在,因爲路徑包含「/../」,java會將其視爲相對路徑並在user.dir
中創建該文件。所以這也是有道理的。
但如果我更新下面的相對路徑:
@Test
public void testPathConversion() {
File f = new File("test/../../test.txt");
try {
f.createNewFile();
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
}
然後我得到IOException異常:訪問被拒絕。
我的問題是:
- 爲什麼
"test/../test.txt"
被視爲相對路徑和"user.dir"
創建文件,但"test/../../test.txt"
返回一個錯誤?它在哪裏嘗試爲路徑"test/../../test.txt"
創建文件? 當找不到指定的相對路徑時,該文件似乎在
user.dir
中創建。所以,在我看來,以下兩種情況做同樣的事情://scenario 1 File f = new File("test/../test.txt"); f.createNewFile(); //scenario 2 File f = new File("test.txt"); f.createNewFile();
那麼,有沒有一個真正的世界的案例,其中一個會用,而不是場景2場景1?
我想我錯過了一些很明顯的東西,或者從根本上誤解了相對路徑。我瀏覽了File的Java文檔,但無法找到解釋。關於相對路徑,在Stack Overflow中發佈了相當多的問題,但是我查找的是針對特定場景的,而不是關於如何解析相對路徑。
如果有人能解釋我這是如何工作的或指向一些相關鏈接,這將是非常好的嗎?
請注意,'user.dir'是一個很不穩定的地方,它應該依賴於脆弱。另一個需要考慮的因素是應用程序。可能沒有安裝在它有*寫權限的地方。**將文件放在'user.home'(的子目錄)中會更加優化和健壯。請參閱[這個答案](http://stackoverflow.com/a/10166623/418556)一個簡短的例子。 –
注意:'test/test.txt'和'test /../ test.txt'都是相對路徑。這個意義上的相對與嵌入式「..」組件的存在無關。 – Boann