What is the difference between using File.separator
and a normal /
in a Java Path-String?
In contrast to double backslash \\
platform independence seems not to be the reason, since both versions work under Windows and 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));
}
}
To rephrase the question, if /
works on Unix and Windows, why should one ever want to use File.separator
?
If you are using Java 7, checkout Path.resolve() and Paths.get().
Using File.separator made Ubuntu generate files with "\" on it's name instead of directories. Maybe I am being lazy with how I am making files(and directories) and could have avoided it, regardless, use "/" every time to avoid files with "\" on it's name
You use
File.separator
because someday your program might run on a platform developed in a far-off land, a land of strange things and stranger people, where horses cry and cows operate all the elevators. In this land, people have traditionally used the ":" character as a file separator, and so dutifully the JVM obeys their wishes.If you are trying to create a File from some ready path (saved in database, per example) using Linux separator, what should I do?
Maybe just use the path do create the file:
But Windows use a different separator (
\
). So, is the alternative convert the slash separator to platform independent? Like:This method
convertPathToPlatformIndependent
probably will have some kind of split by "/" and join with File.separator.Well, for me, that's not nice for a language that is platform independent (right?) and Java already support the use of
/
on Windows or Linux. But if you are working with paths and need to remember to this conversion every single time this will be a nightmare and you won't have any real gain for the application on the future (maybe in the universe that @Pointy described).OK let's inspect some code.
File.java
lines 428 to 435 inFile.<init>
:And let's read
fs/*(FileSystem)*/.fromURIPath()
docs:This means
FileSystem.fromURIPath()
does post processing on URI path only in Windows, and because in the next line:It replaces each '/' with system dependent
seperatorChar
, you can always be sure that '/' is safe in every OS.With the Java libraries for dealing with files, you can safely use
/
(slash, not backslash) on all platforms. The library code handles translating things into platform-specific paths internally.You might want to use
File.separator
in UI, however, because it's best to show people what will make sense in their OS, rather than what makes sense to Java.Update: I have not been able, in five minutes of searching, to find the "you can always use a slash" behavior documented. Now, I'm sure I've seen it documented, but in the absense of finding an official reference (because my memory isn't perfect), I'd stick with using
File.separator
because you know that will work.