2013-05-06 45 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

相关问题