57

私が必要としているのは、ローカル アプリケーション データ ディレクトリへのパスを取得するプラットフォームに依存しない方法です。System.getenv("LOCALAPPDATA")Windowsでのみ動作するようです。どうすればいいですか?

4

6 に答える 6

43

あなたはおそらく次のように言うことができます(私が間違っている場合、またはこれが悪いアプローチである場合は矛盾します)

private String workingDirectory;
//here, we assign the name of the OS, according to Java, to a variable...
private String OS = (System.getProperty("os.name")).toUpperCase();
//to determine what the workingDirectory is.
//if it is some version of Windows
if (OS.contains("WIN"))
{
    //it is simply the location of the "AppData" folder
    workingDirectory = System.getenv("AppData");
}
//Otherwise, we assume Linux or Mac
else
{
    //in either case, we would start in the user's home directory
    workingDirectory = System.getProperty("user.home");
    //if we are on a Mac, we are not done, we look for "Application Support"
    workingDirectory += "/Library/Application Support";
}
//we are now free to set the workingDirectory to the subdirectory that is our 
//folder.

このコードでは、Javaがディレクトリを扱う場合'/'と同じように扱うことを最大限に活用していることに注意してください。'\\'Windows は'\\'pathSeparator として使用しますが、これでも問題あり'/'ません。(少なくとも Windows 7 はそうです。) また、環境変数では大文字と小文字が区別されません。私たちは同じように簡単に言うことができworkingDirectory = System.getenv("APPDATA");、それは同じようにうまくいったでしょう.

于 2013-05-21T00:29:35.887 に答える
24

appdirs個人的には、同様のユースケースに非常に役立つことがわかりました。さまざまな種類の便利なディレクトリを見つける機能があります。

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir←これが必要なようです
  • getSiteConfigDir

返される場所は多かれ少なかれ標準的です。

于 2017-01-11T19:13:48.160 に答える
13

クエストは古いですが、面白い絶対パスではなく、環境変数をリストする回答がありません。私はOSXについて何も知りません。この投稿には、Windows と Linux に関する情報のみが含まれています。

既存の回答を拡張するのに十分なポイントがないため、新しい回答を作成する必要があります。

Linux: 前述のように、Linux ディストリビューションが実現しようとしている標準を定義している freedesktop.org のようなものがあります。環境変数とそのデフォルト値を定義するサブページもあります (設定されていない場合、デフォルトでは空です。アプリケーションは変数をデフォルトに一致させる必要があります)。そのページへのリンク: freedesktop.org env vars

この質問に関連して定義された変数:

  • $XDG_DATA_HOME ( local ) (デフォルト: $HOME/.local/share )
  • $XDG_CONFIG_HOME ( local ) (デフォルト: $HOME/.config )
  • $XDG_DATA_DIRS ( global ) (デフォルト: /usr/local/share/または/usr/share/ )
  • $XDG_CONFIG_DIRS ( global ) (デフォルト: /etc/xdg )

Windows XP:

  • %APPDATA% (デフォルト: C:\Documents and Settings{username}\Application Data )

  • %CommonProgramFiles% (デフォルト: C:\Program Files\Common Files ) (共有プログラム ファイル)

  • %CommonProgramFiles(x86)% (デフォルト: C:\Program Files (x86)\Common Files ) (64 ビットのみ!) (共有プログラム ファイル)

  • %ProgramFiles% (デフォルト: %SystemDrive%\Program Files )

  • %ProgramFiles(x86)% (デフォルト: %SystemDrive%\Program Files (x86) (64 ビット バージョンのみ)) (64 ビットのみ!)

Windows Vista +:

  • %APPDATA% (デフォルト: C:\Users{username}\AppData\Roaming ) (リンクされたワークステーション間で共有。ユーザー ローカル。ファイルと構成を保存)
  • %LOCALAPPDATA% (デフォルト: C:\Users{username}\AppData\Local ) (ユーザー ローカル。ファイルと構成を保存)
  • %CommonProgramFiles% (デフォルト: C:\Program Files\Common Files ) (共有プログラム ファイル)
  • %CommonProgramFiles(x86)% (デフォルト: C:\Program Files (x86)\Common Files ) (64 ビットのみ!) (共有プログラム ファイル)

  • %ProgramFiles% (デフォルト: %SystemDrive%\Program Files ) (インストール後に変更されない静的データ)

  • %ProgramFiles(x86)% (デフォルト: %SystemDrive%\Program Files (x86) (64 ビット バージョンのみ)) (64 ビットのみ!) (インストール後に変更されない静的データ)

  • %ProgramData% (デフォルト: %SystemDrive%\ProgramData ) (すべてのユーザーに影響する変更可能なデータ)

要するに、 Linuxには、設定されていない可能性のある2つの環境変数があります(1つは設定用、もう1つはファイル用)。Windowsには、構成とファイルを一緒に使用するための環境変数が1つしかないことがわかります。絶対パスの代わりにこれらを使用してください。

于 2016-10-05T08:27:04.380 に答える
9

適度な量のデータについては、ここjava.util.prefs.Preferencesで言及されている、またはここで議論されている を検討してください。どちらもクロスプラットフォームです。javax.jnlp.PersistenceService

于 2012-06-20T06:46:13.577 に答える
-4

これを使用できます

String currentDir = new File(".").getAbsolutePath();

またはこれ:

System.getProperty("user.dir")

私は最初のオプションを好みます

よろしく

于 2012-06-20T06:45:01.410 に答える