File.separator与路径中的斜杠之间的区别

时间:2010-03-10 14:15:11

标签: java

在Java Path-String中使用File.separator和普通/有什么区别?

与双反斜杠相比\\平台独立似乎不是原因,因为两个版本都在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

14 个答案:

答案 0 :(得分:291)

你使用File.separator因为有一天你的程序可能会运行在一个遥远的土地上开发的平台上,一个奇怪的东西和陌生人的土地,马匹哭泣,奶牛操作所有的电梯。在这片土地上,人们传统上使用“:”字符作为文件分隔符,因此JVM遵守他们的意愿。

答案 1 :(得分:219)

使用用于处理文件的Java库,您可以在所有平台上安全地使用/(斜杠,而不是反斜杠)。库代码处理内部将事物转换为特定于平台的路径。

但是,您可能希望在UI中使用File.separator,因为最好向人们展示在他们的操作系统中有意义的内容,而不是对Java有意义的内容。

更新:在五分钟的搜索中,我无法找到记录下“你总是可以使用斜线”的行为。现在,我确信我已经看到它记录在案,但由于没有找到官方参考(因为我的记忆不完美),我坚持使用File.separator,因为你知道< / em>会起作用。

答案 2 :(得分:27)

虽然使用File.separator来引用文件名是过度的(对于那些远离陆地的人来说,我想他们的JVM实现会用/取代:,就像windows jvm取代一样它带有\)。

但是,有时您获取文件引用,而不是创建它,并且您需要解析它,并且为了能够这样做,您需要知道平台上的分隔符。 File.separator可以帮助您实现这一目标。

答案 3 :(得分:9)

好的,让我们检查一些代码 File.java中的File.<init>行428到435:

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
  public abstract String fromURIPath(String path)
  必要时对给定的URI路径字符串进行后处理。这是用来   win32,例如,将“/ c:/ foo”转换为“c:/ foo”。路径字符串   还有斜线分离器; File类中的代码将翻译它们   在此方法返回后。

这意味着FileSystem.fromURIPath()仅在Windows中对URI路径进行处理,因为在下一行中:

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

它用系统相关seperatorChar替换每个'/',您可以始终确保'/'在每个操作系统中都是安全的。

答案 4 :(得分:8)

嗯,有比OS和Windows(便携式设备等)更多的操作系统,而Java因其可移植性而闻名。最佳实践是使用它,因此JVM可以确定哪个最适合该操作系统。

答案 5 :(得分:7)

虽然它在路上没有太大的区别,但它会在回来的路上。

当然,您可以在新文件(字符串路径)中使用'/'或'\',但File.getPath()只会为您提供其中一个。

答案 6 :(得分:3)

可移植性简单明了。

答案 7 :(得分:3)

晚会。我使用的是JDK 1.8和Eclipse MARS 1的Windows 10 我找到了

getClass().getClassLoader().getResourceAsStream("path/to/resource");

有效,

getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");

不起作用

getClass().getClassLoader().getResourceAsStream("path\to\resource");

不起作用。最后两个是等价的。所以...我有充分的理由不使用File.separator。

答案 8 :(得分:1)

“Java SE8 for Programmers”声称​​ Java 将处理其中任何一个。 (第480页,最后一段)。 该示例声称:

c:\Program Files\Java\jdk1.6.0_11\demo/jfc

会解析得很好。记下最后一个(Unix风格)分隔符。

它很俗气,可能容易出错,但这是他们(Deitel和Deitel)的主张。

我认为人们而不是Java的混淆是足够的理由不使用这个(错误?)功能。

答案 9 :(得分:1)

绅士们描述了与变体细节的区别。

我建议在处理可能在多个操作系统上部署的程序中的文件时使用Apache Commons io api,类FilenameUtils

答案 10 :(得分:0)

使用主机系统的命名约定指定文件或目录的路径名。但是,File类定义了依赖于平台的常量,这些常量可用于以独立于平台的方式处理文件和目录名称。

Files.seperator定义用于分隔路径名中的目录和文件组件的字符或字符串。对于Unix,Windows和Macintosh,此分隔符分别为“/”,“\”或“:”。

答案 11 :(得分:0)

如果您使用的是Java 7,请结帐Path.resolve()Paths.get()

答案 12 :(得分:0)

使用File.separator使Ubuntu在其名称上生成带有“\”的文件而不是目录。也许我对我如何制作文件(和目录)很懒,并且可以避免它,无论如何,每次使用“/”以避免名称上带有“\”的文件

答案 13 :(得分:0)

如果您尝试使用Linux分隔符从某个就绪路径创建文件(在每个示例中保存在数据库中),我该怎么办?

也许只需使用路径创建文件:

new File("/shared/folder/file.jpg");

但Windows使用不同的分隔符(\)。那么,是否可以将斜杠分隔符转换为平台无关?像:

new File(convertPathToPlatformIndependent("/shared/folder"));

此方法convertPathToPlatformIndependent可能会通过“/”进行某种拆分并与File.separator连接。

嗯,对我来说,对于一种独立于平台的语言来说,不好(对吧?),Java已经支持在Windows或Linux上使用/。但是如果你正在使用路径并且每次都需要记住这个转换,这将是一场噩梦,你将来不会对应用程序有任何实际的好处(可能在@Pointy所描述的宇宙中)。