File manipulation vies with AWT for being the part of Java where
it’s hardest to write truly cross-platform, robust code. Until
Java 2, Sun really didn’t pay a lot of attention to differences
between filesystems on different platforms. The situation is getting
better, however. The java.io.File
class does work
much more reliably across Windows and Unix in Java 2 and has hooks to
allow it to work more naturally on other platforms as well. Of
course, Java 1.1 is still the primary delivery platform for most Java
applications that work with files. To help you achieve greater
serenity and overall cross-platform nirvana, I’ve summarized
some basic rules from this chapter to help you write file
manipulation code that’s robust across a multitude of
platforms:
Never, never, never hardcode pathnames in your application.
Ask the user to name your files. If you must provide a name for a file, try to make it fit in an 8.3 DOS filename with only pure ASCII characters.
Do not assume the file separator is “/” (or anything
else). Use File.separatorChar
instead.
Do not parse pathnames to find directories. Use the methods of the
java.io.File
class instead.
Do not use renameTo()
for anything except renaming
a file. In particular, do not use it to move a file.
Try to avoid moving and copying files from within Java programs if at all possible.
Do not use . to refer to the current directory. Use
System.getProperty ("user.dir")
instead.
Do not use .. to refer to the parent directory. Use
getParent()
instead.
Do not assume the current working directory is the one where your
.class
files live. It almost certainly
won’t be that directory on the Mac, and it may not be on other
platforms, including Windows and Unix.
Place any data files your program requires in JAR archives rather than directly in the filesystem, then load them as resources from the class path.
When in doubt, it never hurts to convert filenames to canonical form.
Do not assume anything about filesystem conventions. Some platform somewhere will surprise you. (Have you tested your program on BeOS yet?)
Test your code on as many different filesystems as you can get your hands on.
Despite all the problems I’ve pointed out, it is mostly possible to write robust file access code that works across all platforms where Java runs. But doing so requires understanding, effort, and thought. You cannot simply write for Windows or Unix and hope things will work out for the best on other platforms. You must plan to handle a wide range of filesystems and filename conventions.
3.142.136.159