在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));
}
}
Run Code Online (Sandbox Code Playgroud)
要重新解释这个问题,如果/适用于Unix和Windows,为什么要使用File.separator?
Poi*_*nty 300
你使用的File.separator是因为有一天你的程序可能会运行在一个遥远的土地上开发的平台上,一个奇怪的东西和陌生人的土地,在那里马匹哭泣,奶牛操作所有的电梯.在这片土地上,人们传统上使用":"字符作为文件分隔符,因此JVM尽职尽责地遵循他们的意愿.
T.J*_*der 230
使用用于处理文件的Java库,您可以/在所有平台上安全地使用(斜杠,而不是反斜杠).库代码处理内部将事物转换为特定于平台的路径.
File.separator但是,您可能希望在UI中使用,因为最好向人们展示在他们的操作系统中有意义的东西,而不是对Java有意义的东西.
更新:在五分钟的搜索中,我无法找到记录下"你总是可以使用斜线"的行为.现在,我确信我已经看到它记录在案,但由于没有找到官方参考(因为我的记忆并不完美),我坚持使用,File.separator因为你知道它会起作用.
Yis*_*hai 27
虽然使用文件分割符来引用文件名是矫枉过正(对于那些谁想象遥远的土地,我想象他们的JVM实现将替换/了:,就像窗户JVM用替换它\).
但是,有时您获取文件引用,而不是创建它,并且您需要解析它,并且为了能够这样做,您需要知道平台上的分隔符.File.separator可以帮助您实现这一目标.
好吧,让我们检查一些代码.
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);
Run Code Online (Sandbox Code Playgroud)
让我们阅读fs/*(FileSystem)*/.fromURIPath()文档:
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);
Run Code Online (Sandbox Code Playgroud)
它用系统相关的每个'/'替换seperatorChar,你总是可以确保'/'在每个操作系统中都是安全的.
小智 6
聚会迟到了。我在使用 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。
| 归档时间: |
|
| 查看次数: |
281636 次 |
| 最近记录: |