使用文件有什么区别。分隔符和正常的/在Java路径字符串?

与双反斜杠相比,平台独立性似乎不是原因,因为这两个版本都可以在Windows和Unix下运行。

public class SlashTest {
    @Test
    public void slash() throws Exception {
        File file = new File("src/trials/SlashTest.java");
        assertThat(file.exists(), is(true));
    }

    @Test
    public void separator() throws Exception {
        File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
        assertThat(file.exists(), is(true));
    }
}

换句话说,如果/可以在Unix和Windows上工作,为什么要使用File.separator?


当前回答

便携性简单明了。

其他回答

文件或目录的路径名使用主机系统的命名约定指定。但是,File类定义了与平台相关的常量,可用于以与平台无关的方式处理文件和目录名。

文件。分隔符定义在路径名中分隔目录和文件组件的字符或字符串。对于Unix、Windows和Macintosh,分隔符分别为'/'、'\'或':'。

操作系统比Unix和Windows多(可移植设备等),Java以其可移植性而闻名。最佳实践是使用它,这样JVM就可以确定哪个最适合该操作系统。

好的,让我们检查一些代码。 <init>:

String p = uri.getPath();
if (p.equals(""))
    throw new IllegalArgumentException("URI path component is empty");

// Okay, now initialize
p = fs.fromURIPath(p);
if (File.separatorChar != '/')
p = p.replace('/', File.separatorChar);

然后读取fs/*(FileSystem)*/.fromURIPath() docs:

java.io.FileSystem 字符串的路径 如果需要,对给定的URI路径字符串进行后处理。这是用于 Win32,例如,将“/c:/foo”转换为“c:/foo”。路径字符串 仍然有斜杠分隔;File类中的代码将转换它们 在此方法返回之后。

这意味着filessystem . fromuripath()只在Windows中对URI路径进行后处理,因为在下一行中:

p = p.replace('/', File.separatorChar);

它将每个'/'替换为依赖于系统的seperatorChar,您可以始终确保'/'在每个操作系统中都是安全的。

迟到了。我使用的是Windows 10, JDK 1.8和Eclipse MARS 1。 我发现

.getResourceAsStream .getClassLoader getClass()()(“路径/ /资源”);

工作和

.getResourceAsStream .getClassLoader getClass()()(“路径”+ File.separator + " " + File.separator +“资源”);

不工作

.getResourceAsStream .getClassLoader getClass()()(“路径\ \资源”);

不管用。后两个是等价的。所以…我有很好的理由不使用File.separator。

使用文件。separator使Ubuntu生成的文件名称上有“\”而不是目录。也许我在如何创建文件(和目录)方面很懒惰,本可以避免它,无论如何,每次都使用“/”来避免名称上带有“\”的文件