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