Java on the desktop: Which paths to use?
Applications (like a word-processor) sometimes need to store
or access files. To help users with little computer
experience, there should be safe defaults for the paths,
because not all users can find the best paths themselve.
One can not assume that a Java application is running under a
type of UNIX/Linux or Windows, so one only is allowed to rely
on the standard methods and classes of Java SE, not to use
code for specific host operating systems (at least, assume
this for this question).
How is the path to store the following type of files determined
within such a Java applicataion?
- User documents (the user can choose any path, but the
application should suggest a reasonable default)
- read-only data (The word-processor might use a file with data
for a spell-checker that is not user specific)
- User specific program configuration (like the background
color of program's main window or user-specific extensions
for the spell-checker)
- log files (The word-processor keeps records of who edited which
document at which time), this might be inspected by the user
- debug log files (The word processor writes reports about
abnormal program endings to a log file that is not intended
to be read by users, but can be send to the manufacturer of
the program as a bug report)
- backup files (The word-processor keeps some old versions of a
document, so the user can restore them later)
- databases (The words processor supports sending form letters
and can be used to maintain a database of customers, which
eventually is stored in a file)
- (meta) user specific settings for all of the above:
The user can overwrite the defaults for all of the
above paths, and these overwrite settings needs to be stored
somewhere, too.
~~
A footnote to anticipate answers involving ?user.home?:
The documentation says this:
?This set of system properties always includes values for
the following key: [...]
user.home User's home directory
user.dir User's current working directory?
http://download.java.net/jdk7/docs/api/java/lang/System.html
?java.lang.System.getProperty( "user.home" )? might sound
good, but gives ?C:\WINDOWS? on Windows 9x, which might not be
the best place for user documents.
It is not only broken on Windows 9x, but also on Windows NT:
?We made a conscious decision to change the definition of
the "user.home" property on Win32; see 4100238 for more
info. This is not a bug.?
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4162112
(If Sun Microsystems, Inc. is free to make such a decision,
but why don't they document it at the appropriate place, that is, in
http://download.java.net/jdk7/docs/api/java/lang/System.html?)
It also is broken on Vista:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6519127
And also Microsoft?'s VM does it wrong:
http://support.microsoft.com/kb/221206
So we know now that there is a conspiracy among JVM producers
to make ?java.lang.System.getProperty( "user.home" )? unusable.
(When it can not be used on Windows, it can not be used in a
portable desktop Java program generally, because this should run
under /all/ supported platforms.)
The question still is, what to use instead.
I already had posted my idea for an answer recently myself,
but would not like to mention this now, so that I can get
your unbiased opinion about this.