2013-05-06 44 views
1

我有以下的Java代碼:編譯器的編碼系統特定的文件分隔符

public interface Defaults { 
    public static final String DIR_PATH = "a/b/c/"; 
    File DIR_FILE = new File(DIR_PATH); 
} 

public class Main { 
    public File directory = Defaults.DIR_FILE; 
} 

這被編譯在Windows計算機上,並部署到我們當地的關係資源庫。然後它在一臺Linux機器上的Maven構建過程中執行。我結束main.directory.list()返回null。使用mvnDebug,我看到文件的路徑實際上是a\b\c!如果我使用調試器將目錄更改爲new File("a/b/c"),那麼我的代碼就可以工作。

爲什麼編譯器編碼系統特定的分隔符?有解決方案嗎?

回答

2

不像其他人都告訴你,這是無關的Windows和File.separator

String DIR_PATH = "a/b/c/"僅僅是一個字符串,Java和編譯器都沒有試圖理解它的含義,所以你在Windows和Linux上都可以得到相同的值。

另請注意,/在Unix和Windows上都可以作爲文件分隔符使用,所以這也不是問題。必要時,Java會將/轉換爲\

File DIR_FILE = new File(DIR_PATH);是一個常數,但在加載類時,仍然由VM在運行時執行​​。所以路徑是不是轉換爲Windows格式,而編譯器生成字節碼。

因此,您所描述的問題必須在其他地方或您發佈的代碼示例的重要部分在針對該問題進行簡化時發生了變化。我的猜測是有人把Windows風格的路徑放到其他地方的代碼中,或者可能是配置,而你忽略了這一點。

這就是說,建立路徑的安全的方法是使用File(File, String)

File DIR_PATH = new File("a", new File("b", "c")); 

這將始終建立這樣的作品,無論是文件分隔符是什麼路徑。如果你必須的話,你可以使用

File DIR_PATH = "a" + File.separator + "b" + File.separator + "c"; 

但是,這可能會失敗的更復雜的例子,它是更多的文字閱讀。

2

是使用File.separatorChar

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

+0

謝謝 2013-05-06 09:09:32

+0

我很想-1這個;你不應該爲此使用'System.getProperty()'。始終使用'File.separator'和'File.separatorChar':它們更快,類型安全,更易於閱讀,錯字安全,避免字符串文字。 – 2013-05-06 09:29:25

+0

@Aaron感謝您的陳述,使您的總體感,基於您的建議更新了答案 – 2013-05-06 09:34:05

0
public static final String DIR_PATH = "a"+File.separator"+"b"+File.separator+"c" 
+0

-1不要使用'System.getProperty()'。總是使用File.separator和File.separatorChar:它們更快,類型安全,更易於閱讀,錯字安全,避免字符串文字。 – 2013-05-06 09:32:58

+0

@AaronDigulla,感謝您的建議 – 2013-05-06 10:08:58

+0

@AaronDigulla爲什麼?這個建議與你自己的答案相矛盾,這是正確的。 Java中不需要使用反斜槓*或*'File.separator'。 '/'總是有效的。 – EJP 2013-05-06 10:10:47

相關問題