代码之家  ›  专栏  ›  技术社区  ›  Joe23

路径中file.separator和斜线的区别

  •  179
  • Joe23  · 技术社区  · 16 年前

    使用的区别是什么 File.separator 正常 / 在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上工作,为什么要使用 文件.分隔符 ?

    14 回复  |  直到 8 年前
        1
  •  215
  •   T.J. Crowder    16 年前

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

    你可能想用 File.separator 但是,在UI中,最好是告诉人们在操作系统中什么是有意义的,而不是对Java有什么意义。

    更新 :在五分钟的搜索中,我无法找到文档中记录的“始终可以使用斜线”行为。现在,我确信我已经看到它被记录下来了,但是在找不到正式的参考资料的情况下(因为我的记忆不完美),我会继续使用 文件分离器 因为你 知道 那行得通。

        2
  •  289
  •   Pointy    16 年前

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

        3
  •  26
  •   Yishai    16 年前

    尽管使用file.separator引用一个文件名是多余的(对于那些想象遥远的土地的人,我想他们的JVM实现将取代 / 用一个 : 就像Windows JVM用 \ )

    但是,有时您得到的是文件引用,而不是创建它,您需要解析它,为了能够做到这一点,您需要知道平台上的分隔符。file.separator帮助您完成这项工作。

        4
  •  7
  •   jpabluz    16 年前

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

        5
  •  7
  •   William Billingsley    16 年前

    虽然在进去的路上没什么区别,但在回来的路上却有。

    当然,您可以在新文件(字符串路径)中使用“/”或“\”,但file.getpath()将只提供其中一个。

        6
  •  7
  •   Alireza Mohamadi    9 年前

    好的,让我们检查一些代码。
    File.java 测线428至435英寸 File.<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() 文件:

    java.io.filesystem文件系统
    公共抽象字符串FromUriPath(字符串路径)
    必要时,对给定的URI路径字符串进行后处理。这是用在 win32,例如将“/c:/foo”转换为“c:/foo”。路径字符串 仍然有斜杠分隔符;文件类中的代码将转换它们 在这个方法返回之后。

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

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

    它将每个“/”替换为依赖于系统的 seperatorChar ,您可以始终确保“/”在 每一个 操作系统。

        7
  •  3
  •   Holograham    16 年前

    可移植性简单明了。

        8
  •  3
  •   i-make-robots    10 年前

    参加聚会迟到了。我在Windows10上,有JDK1.8和EclipseMars1。
    我发现

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

    作品及

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

    不起作用

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

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

        9
  •  1
  •   Erik Bennett    11 年前

    “JavaSE8程序员”声称 爪哇 两者都能应付。(第480页,最后一段)。 示例声称:

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

    会分析得很好。注意最后一个(Unix样式)分隔符。

    这很俗气,可能也容易出错,但这正是他们(deitel和deitel)声称的。

    我认为人们的困惑,而不是Java,是足够的理由不使用这个(MIS?)特征。

        10
  •  1
  •   E_X Frank Sposaro    11 年前

    正如先生们所描述的那样,不同之处有不同的细节。

    我想推荐使用 Apache Commons io 类API FilenameUtils 当处理程序中的文件时,有可能部署在多个OSS上。

        11
  •  0
  •   shubhankar    12 年前

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

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

        12
  •  0
  •   ceilfors    11 年前

    如果您正在使用Java 7,请签出 Path.resolve() Paths.get() .

        13
  •  0
  •   Guedez    9 年前

    使用file.separator,Ubuntu生成的文件名为\,而不是目录。也许我对我制作文件(和目录)的方式很懒惰,而且可以避免它,不管怎样,每次使用“/”来避免文件名为\“的文件

        14
  •  0
  •   Dherik    8 年前

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

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

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

    但是Windows使用不同的分隔符( \ )那么,是否可以将斜线分隔符转换为独立于平台的?像:

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

    这种方法 convertPathToPlatformIndependent 可能会有一些由“/”拆分并用file.separator联接的类型。

    对我来说 不好 对于平台独立的语言(对吗?)而Java已经支持使用 / 在Windows或Linux上。但是,如果您使用的是路径,并且每次都需要记住这种转换,那么这将是一场噩梦,而且您在未来的应用程序中不会有任何真正的收益(可能在@pointy描述的宇宙中)。