File.separator与FileSystem.getSeparator()与System.getProperty(“ file.separator”)?


136

似乎有三种相同的方法可以独立于平台获取依赖于平台的“文件分隔符”:

我们如何决定何时使用哪个?

它们之间甚至有什么区别吗?


您实际上不是在这里得到与平台相关的文件分隔符吗?只是在独立于平台的庄园中。
steinybot 2014年

@Steiny,是的,更新了。
Pacerier 2014年

一个典型的Java问题至少有3个或更多答案
Stimpson Cat,

Answers:


142

System.getProperties()可以通过调用System.setProperty(String key, String value)命令行参数或使用命令行参数覆盖-Dfile.separator=/

File.separator 获取默认文件系统的分隔符。

FileSystems.getDefault() 获取默认文件系统。

FileSystem.getSeparator()获取文件系统的分隔符。请注意,作为实例方法,在需要代码在一个JVM中对多个文件系统进行操作的情况下,可以使用该方法将不同的文件系统传递给默认值以外的代码。


2
酷= D顺便说一句,您能否详细介绍“操作多个文件系统”这一部分?
Pacerier,2011年

4
@Pacerier从理论上讲,如果我编写了一个新的文件系统(BringerFS),其分隔符为“:”,并且您有一台具有2个分区的计算机,一个分区在NTFS中,一个分区在BringerFS中,则此功能将允许您同时使用两个分区(假设我还写了一个Java Filesystem提供程序。
Bringer128

我的意思是实际上有用吗,比如说某人有2个分区,一个Windows和一个UNIX,并且他正在Windows分区上运行我的应用程序,那么该类是否可以访问他的UNIX文件系统?(由于没有安装其他文件系统,因此我无法进行实际测试。)
Pacerier,2011年

1
我怀疑Windows上大多数文件系统驱动程序都会执行到“ Windows风格”文件系统API的转换,从而使OS和非便携式应用程序都能正常工作。实际用途必须是用于支持怪异而出色的文件系统的操作系统,而无需像Windows这样的固定范例。
Bringer128

哦,要回答您的另一个问题-您要FileSystem处理的每个文件系统都有一个不同的实例。
Bringer128

31

如果您的代码没有跨越文件系统的边界,即您仅使用一个文件系统,请使用java.io.File.separator

如所述,这将为您提供FS的默认分隔符。正如Bringer128所解释的那样,System.getProperty("file.separator")可以通过命令行选项覆盖它,并且类型不如java.io.File.separator

最后一个java.nio.file.FileSystems.getDefault().getSeparator();是在Java 7中引入的,因此,如果您希望代码可以在较旧的Java版本中移植,则最好暂时忽略它。

因此,这些选项中的每个选项几乎都与其他选项相同,但并不完全相同。选择一种适合您的需求。


是否java.io赞成java.nio
Pacerier

13
@Pacerier:不,不推荐使用。java.io的级别略低于java.nio,但仍然非常有用。您可以在此处看到差异:blogs.oracle.com/slc/entry/javanio_vs_javaionio不替换io,而是以多种方式(并io在引擎盖下使用)对其进行了扩展。
darioo 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.