2010-09-20 51 views
2

我正在不同的平臺上工作(Solaris/Windows)。我需要創建一個包含多個路徑元素的對象。問題是:「逐步」創建最終的File對象還是一次調用會更好。後者假定Java在不同的平臺上進行正確的路徑映射。由於不同的文件分隔符,它總是執行正確的映射嗎?從幾個文件對象創建路徑或只有一個

File parent = // some directory; 

// Use several file objects... 
File myFile1 = new File(new File(new File(parent, "part1"), "part2"), "myfile"); 

// .. or use just on (on all platforms!)? 
File myFile2 = new File(parent, "part1/part2/myfile"); 

第一個解決方案是可能的(a)更慢和(b)的可讀性...

+0

如果您打算進行io操作,請不要介意這兩種方法中的一種比另一種更「慢」。 – aioobe 2010-09-20 07:47:31

回答

1

使用:第二個,而是硬編碼正斜槓,使用File.separatorChar/File.separator

與系統有關的默認名稱分隔符。該字段被初始化爲包含系統屬性file.separator的值的第一個字符。在UNIX系統上,這個字段的值是'/';在Microsoft Windows系統上它是'\'。

注意,你並不需要與Sun的JVM做到這一點 - Win32FileSystem類轉換着反斜槓 - 如果你看一下它的代碼,它有slashaltSlash,並且如果altSlash/)是遇到,類標準化的路徑

但是,正如指出的意見,爲了除非你想做的父文件對象的某些操作仍然相信,你的代碼將是便攜,使用File.separator

+2

你知道JRE不理解斜槓是路徑分隔符嗎?我不。 Sun的庫允許您在任何平臺上使用前斜線或後斜線。誠然,據我所知,它沒有*記錄*的行爲,因此一個不同的,綠地實施可能會更具限制性。不過,我敢打賭,大量的代碼會在這個實現上破壞。 – 2010-09-20 07:43:25

+0

@ T.J。 Crowder你是對的。我補充說明了這一點。 – Bozho 2010-09-20 07:59:19

+0

我認爲**你也是對的:依靠Sun的行爲意味着某人的代碼不適用於某些假設的文件系統,該文件系統使用不同的字符作爲分隔符,而lib由於含糊不清而無法執行此操作(比如說''')。我認爲這就是爲什麼行爲沒有(也可能不會)記錄。當然,這是一個「在那裏」的情景,但依靠無證行爲總是至少有一點*(有時很多)有風險。 – 2010-09-20 08:12:17

2

我沒有看到在溶液中的任何優點(1)。兩者都會創建一個有效的File對象,當然,第二種解決方案更容易理解,因爲它清楚地表明,您有一條相對於某個父文件夾的路徑。

0

(例如,如果目錄存在)或爲多個文件重用父文件對象,在第一個解決方案上沒有優勢。如果您僅爲一個文件創建File對象,請使用第二個。這不太冗長。

相關問題