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上的文件路径问题的主要内容,如果未能解决你的问题,请参考以下文章