java中Windows与Unix上的文件路径问题

Posted

技术标签:

【中文标题】java中Windows与Unix上的文件路径问题【英文标题】:File path issue on windows vs Unix in java 【发布时间】:2018-03-21 15:19:36 【问题描述】:

在我的程序中,我正在读取用于单元测试的资源文件。我使用文件路径为:

\\\path\\\to\\\file

在我的机器(Windows)上运行良好。但是在服务器(Unix)上,这会失败,我必须将其更改为:/path/to/file

但是 Java 应该是独立于平台的。那么这种行为是不是出乎意料呢?

【问题讨论】:

相关帖子:***.com/questions/3548775/… 【参考方案1】:

使用FileSystem.getSeparator()System.getProperty("file.separator") 而不是使用斜杠。

编辑: 您可以通过FileSystems.getDefault (JDK 1.7+) 获取FileSystem 的实例

【讨论】:

您可能想澄清如何获取FileSystem 实例【参考方案2】:

您可以使用File.separator 以独立于平台的方式获取适当的字符。

【讨论】:

【参考方案3】:

Java 独立于平台。文件path-es和一些系统调用都没有。

只要路径是相对的,就可以使用File.separator

    String path = "path" + File.separator + "to" + File.separator + "file";
    System.out.println(path); // prints path\to\file on windows

有时可以选择提供一个属性文件并让用户定义该实际文件的路径。这样完整路径也可以。您可以像这样读取属性:

    Properties props = new Properties();
    props.load(new FileInputStream(filePath));

下一个问题是:如何指定那个文件的位置?那可能是相对路径上的文件。如果这对您的应用不可行,那么您可以让用户在系统属性中指定它:

java ... -DconfigFile=C:\TEMP\asd.txt .... -jar myapp.jar

然后你可以这样访问它:

// prints C:\TEMP\asd.txt if you specified -DconfigFile=C:\TEMP\asd.txt
System.out.println(System.getProperty("configFile"));

【讨论】:

【参考方案4】:

这是预期的行为。

Java 代码 在任何机器/操作系统上编译,前提是您安装了正确版本的 Java。

但是,在运行时,您的代码只能看到一个变量 value,就像另一个变量一样,恰好是 \path\to\file

当它与文件系统对话时,它使用那个特定的值;然后文件系统会尝试找到你给它的路径;这就是为什么一种语法在 Windows 上运行良好但在 Linux 上无法运行的原因。

【讨论】:

【参考方案5】:

更好的方法是:

val pathUri = Paths.get(".//src//test//res//file.txt").toUri()
val is = FileInputStream((File(pathUri)))

【讨论】:

以上是关于java中Windows与Unix上的文件路径问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上的 hunspell 搜索路径中添加字典路径?

Unix机器上的Tessart4j

UNIX Laravel Artisan文件权限

文件路径:/和的区别

java怎么去除路径最后文件名,获取文件夹路径?

为啥 Python 文件锁库会删除 Windows 上的锁文件,而不是 UNIX?