我有以下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机器上编译并部署到我们的本地nexus存储库。然后在linux机器上的maven构建期间执行它。我最终以main.directory.list()
返回null。使用 mvnDebug ,我看到文件的路径实际上是a\b\c
!如果我使用调试器将目录更改为new File("a/b/c")
,那么我的代码就可以运行。
为什么编译器会编码特定于系统的分隔符?有解决方案吗?
答案 0 :(得分:3)
与其他人告诉您的不同,这与Windows和File.separator
无关。
String DIR_PATH = "a/b/c/"
只是一个字符串,Java和编译器都不会尝试理解它的含义,因此在Windows和Linux上都可以获得相同的值。
另请注意,/
在Unix和Windows上都可用作文件分隔符,因此这也不是问题。必要时,Java会将/
转换为\
。
File DIR_FILE = new File(DIR_PATH);
是一个常量,但在加载类时,VM仍会在运行时执行new File()
。因此,当编译器生成字节代码时,路径不转换为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";
但是对于更复杂的示例而言可能会失败,而且需要阅读更多文本。
答案 1 :(得分:2)
系统相关的默认名称分隔符。此字段初始化为包含系统属性file.separator的值的第一个字符。在UNIX系统上,该字段的值为“/”;在Microsoft Windows系统上它是'\'。
答案 2 :(得分:1)
答案 3 :(得分:0)
public static final String DIR_PATH = "a"+File.separator"+"b"+File.separator+"c"