java中separator_java - File.separator和路径中的斜杠之间的区别

这篇博客探讨了在Java中使用`File.separator`与直接使用斜杠`/`在创建文件路径时的差异。尽管两者在某些情况下都能正常工作,但使用`File.separator`确保了代码的平台独立性,因为它会根据当前操作系统自动适配正确的路径分隔符。文章通过测试代码展示了这一点,并强调了在处理文件路径时使用`File.separator`的可移植性和最佳实践。
摘要由CSDN通过智能技术生成

java - File.separator和路径中的斜杠之间的区别

在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?

Joe23 asked 2019-04-07T18:51:44Z

14个解决方案

285 votes

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

Pointy answered 2019-04-07T18:52:34Z

214 votes

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

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

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

T.J. Crowder answered 2019-04-07T18:52:08Z

26 votes

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

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

Yishai answered 2019-04-07T18:53:07Z

7 votes

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

jpabluz answered 2019-04-07T18:53:32Z

7 votes

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

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

William Billingsley answered 2019-04-07T18:54:04Z

6 votes

好吧,让我们检查一些代码。

File.java行428到435在seperatorChar中:

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);

让我们阅读seperatorChar文档:

java.io.FileSystem

public abstract String fromURIPath(String path)

必要时对给定的URI路径字符串进行后处理。 这是用来   win32,例如,将“/ c:/ foo”转换为“c:/ foo”。 路径字符串   还有斜线分离器; File类中的代码将翻译它们   这个方法返回后。

这意味着seperatorChar仅在Windows中对URI路径进行后期处理,因为在下一行中:

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

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

Alireza Mohamadi answered 2019-04-07T18:55:17Z

3 votes

便携性简单明了。

Holograham answered 2019-04-07T18:55:42Z

3 votes

迟到了。 我在Windows 10上使用JDK 1.8和Eclipse MARS 1。

我发现

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

工作和

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

不起作用

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

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

i-make-robots answered 2019-04-07T18:56:44Z

1 votes

“Java SE8 for Programmers”声称Java将应对这两种情况。 (第480页,最后一段)。该示例声称:

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

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

它很俗气,而且可能容易出错,但这正是他们(Deitel和Deitel)声称的。

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

Erik Bennett answered 2019-04-07T18:57:29Z

1 votes

正如先生们描述了与变体细节的区别。

我想建议在处理程序中的文件时使用Apache Commons io api,类

E_X answered 2019-04-07T18:58:01Z

0 votes

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

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

shubhankar answered 2019-04-07T18:58:37Z

0 votes

如果您使用的是Java 7,请检查Path.resolve()和Paths.get()。

ceilfors answered 2019-04-07T18:59:02Z

0 votes

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

Guedez answered 2019-04-07T18:59:28Z

0 votes

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

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

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

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

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

这个方法/可能会有一些“/”拆分并与File.separator连接。

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

Dherik answered 2019-04-07T19:00:24Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值