windows 上的文件路径问题与 java 中的 Unix 相比
File path issue on windows vs Unix in java
在我的程序中,我正在读取一个单元测试的资源文件。我使用文件路径为:
\\path\\to\\file
在我的机器上(Windows)运行良好。但是在服务器(Unix)上,这失败了,我必须将其更改为:/path/to/file
但是 Java 应该是独立于平台的。那么这种行为是不是出乎意料?
使用 FileSystem.getSeparator()
或 System.getProperty("file.separator")
而不是使用斜杠。
编辑:
您可以通过 FileSystems.getDefault
(JDK 1.7+)
获取 FileSystem
的实例
您可以使用 File.separator
以 platform-independent 的方式获取适当的字符。
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"));
这是预期的行为。
Java code 编译 在任何 machine/OS 上只要你有正确版本的 Java 安装在上面。
但是,在 运行 时,您的代码只看到一个变量 value,就像另一个变量一样,恰好是 \path\to\file
当它与文件系统对话时,它使用那个特定的值;然后文件系统试图找到你给它的路径;这就是为什么一种语法在 Windows 上工作正常但在 Linux.
上不起作用的原因
更好的方法是:
val pathUri = Paths.get(".//src//test//res//file.txt").toUri()
val is = FileInputStream((File(pathUri)))
在我的程序中,我正在读取一个单元测试的资源文件。我使用文件路径为:
\\path\\to\\file
在我的机器上(Windows)运行良好。但是在服务器(Unix)上,这失败了,我必须将其更改为:/path/to/file
但是 Java 应该是独立于平台的。那么这种行为是不是出乎意料?
使用 FileSystem.getSeparator()
或 System.getProperty("file.separator")
而不是使用斜杠。
编辑:
您可以通过 FileSystems.getDefault
(JDK 1.7+)
FileSystem
的实例
您可以使用 File.separator
以 platform-independent 的方式获取适当的字符。
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"));
这是预期的行为。
Java code 编译 在任何 machine/OS 上只要你有正确版本的 Java 安装在上面。
但是,在 运行 时,您的代码只看到一个变量 value,就像另一个变量一样,恰好是 \path\to\file
当它与文件系统对话时,它使用那个特定的值;然后文件系统试图找到你给它的路径;这就是为什么一种语法在 Windows 上工作正常但在 Linux.
上不起作用的原因更好的方法是:
val pathUri = Paths.get(".//src//test//res//file.txt").toUri()
val is = FileInputStream((File(pathUri)))