Javaで使用するファイルを保存するディレクトリどこに置きますか?

Javaで作ったアプリケーションを公開しようと考えていたのですが、アプリケーションで読み書きするファイルをどこに保存したらいいのか悩んでしまいました。
読むだけの場合はJarファイルに一緒に固めてしまえばいいのですが、書き込みも行う場合はそうもいきません。
このようなファイルの保存先を選択するには大きく分けて

  1. アプリケーションが勝手に決める
  2. ユーザに決めさせる

の二つがあります。

1. アプリケーションが保存先を勝手に決める

Jarファイルと同じディレクトリでもいいのですが、そこがProgram FilesなどだとWindows Vista以降ではUACのせいで色々と面倒になります。
ここで挙げるのはホームディレクトリのパスを取得し、そこにOSごとの保存先パスを付け足してやる方法です。

String homePath = System.getProperty("user.home");
String osName = System.getProperty("os.name");
String subPath = "";
if (osName.contains("Windows")) {
  if (osName.contains("Vista") || osName.contains("7")) {
    subPath = "Documents";
  } else {
    subPath = "My Documents";
  }
} else if (osName.contains("Mac OS X")) {
  subPath = "Library/Preferences";
}
java.io.File prefDirParent = new java.io.File(homePath, subPath);
java.io.File prefDir = new java.io.File(prefDirParent, "ProjectName");

OSごとの設定が必要にはなりますが、ユーザに手間をかけさせずに決めることができます。

2. ユーザに保存先を決めさせる

アプリケーションが勝手に決めるのではなくどこそこに保存することをユーザに操作させる方法です。
特に巨大なファイルを操作するときに別のディスクに保存しておきたいというユーザの希望にも応えることができます。

javax.swing.JFileChooser dirChooser = new javax.swing.JFileChooser(".");
dirChooser.setDialogTitle("保存先を指定してください");
dirChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
int ret = dirChooser.showOpenDialog(null); 
if (ret != javax.swing.JFileChooser.APPROVE_OPTION) return;
prefDir = dirChooser.getSelectedFile();

初期起動時に決めさせるかインストーラで管理者権限のあるうちにやってしまうかなどいくつか方法があります。ちなみに「ユーザが決めた設定(ここでは保存先のパス)をどこに保存するか?」という疑問に対しては"java.util.prefs.Preferences"を使うのがいいと思います。Windowsの場合レジストリを使用するようなのでそれが嫌な場合には使えませんが:(

まとめ

  • 読み込みしかしないのであればJarに入れてClass#getResourceAsStream
  • 自分しか使わないのであれば固定パス(orカレントディレクトリ)
  • 文字列しか設定しないのであればPreferences
  • それ以外は上記の方法くらいしか思いつきません。
  • もっと上手な方法があればコメントにて教えてくださいませ