在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
?
答案 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所描述的宇宙中)。