Javaでいくつかの設定を保存するための.INIファイルを作成する方法は?
-
10-07-2019 - |
質問
iniファイルを作成して、アプリケーションの設定を保存したい。 jarファイルの場所を見つけて、そこにiniファイルを作成するのは良い考えですか?はいの場合、jarファイルの場所を見つけるにはどうすればよいですか?
しかし、このようなもののより良い解決策を知っているなら、それらのいくつかを聞きたいです。
編集:Macを使用していて、Windowsで同じアプリケーションを実行したい。 System.getProperty(" user.home")ディレクトリに何かを書くこともできますが、ユーザーがアプリを削除することにした場合は、システムをクリーンに保ちたいと思います。たとえば、アプリケーションと同じディレクトリに設定ファイルを保存するより良い方法はありませんか?
解決
ClassLoaderを使用して、アプリケーションディレクトリを見つけることができます。参照: Java:アプリケーションディレクトリの検索。 .INI ファイルではなく、 .properties ファイルを使用します-プロパティクラス。
他の人が指摘したように、アプリケーション設定にユーザー設定を書き込まないでください。ユーザーがアプリケーションディレクトリへの書き込みアクセス権を持っていない場合はどうなりますか?同じシステム上の複数のユーザーが同時にアプリケーションを使用している場合はどうなりますか?これらの状況はいずれも、Windowsでも珍しいことではありません。
アプリケーションディレクトリからいくつかの設定をロードしたい場合があります-管理者がデフォルト設定を構成している可能性があります。
一般的な規則は、ユーザー設定をユーザーのホームディレクトリに保存することです。
/home/user/.eclipse
C:\Documents and Settings\User\.eclipse
これは、不要なファイルを残す可能性があることを意味しますが、ユーザーがアプリを再インストールする場合に有益です。そのようなことをREADMEで文書化します。ディレクトリへの参照を作成および取得する方法は次のとおりです。
public static File getSettingsDirectory() {
String userHome = System.getProperty("user.home");
if(userHome == null) {
throw new IllegalStateException("user.home==null");
}
File home = new File(userHome);
File settingsDirectory = new File(home, ".myappdir");
if(!settingsDirectory.exists()) {
if(!settingsDirectory.mkdir()) {
throw new IllegalStateException(settingsDirectory.toString());
}
}
return settingsDirectory;
}
UNIXライクなオペレーティングシステムでは、ディレクトリ名をピリオド(&quot.myappdir")で開始すると、ディレクトリが非表示になります。 Windowsでは、マイドキュメントの下に配置されるため、ユーザーは検索しない限りディレクトリを表示しません。
他のヒント
(手動で編集するのではなく)アプリケーションによってのみ設定が書き込まれる場合は、 Preferences API 。
アプリケーションのインストールディレクトリに一時ファイルを保存しないでください。アプリケーションを実行しているユーザーには、そのディレクトリへの書き込みアクセス権がない可能性があることに注意してください。そのようなものを置く最も安全な場所は、C:\ Documents and Settings \ username \ Application Data \ ApplicationNameフォルダーです(必要に応じて名前を調整します)。
しかし、私はおそらく、コンピューター上のファイルではなく、レジストリにそのような種類のものを保存するでしょう。 (しかし、それは私だけです。)
通常、Javaプログラマーは.iniファイルを使用せず、.propertiesファイル(異なる形式)を使用します。必要に応じて、java.lang.Propertiesクラスを優れたプログラムラッパーとして使用できます。
クラスの.classメンバーでgetProtectionDomain()。getCodeSource()。getLocation()を呼び出してjarファイルの場所を取得できますができませんこれを行うことをお勧めします。
代わりに、ファイルをSystem.getProperty(" user.home")ディレクトリ-ユーザーのホームディレクトリに書き込むか、それが本当に一時的な場合はSystem.getProperty(" java.io.tmpdir")
通常の状況で、iniを人間が読み取り/書き込み可能にする必要があるかどうかによって異なります。そうでない場合は、iniファイルではなくプロパティファイルを使用して、「ユーザー」に保存できます。ディレクトリ。
jarファイルを見つけるには、jarからロードされることがわかっているクラスのClassLoaderを見つけて、適切なタイプのClassLoaderであることを確認する必要があります(つまり、本当に jarからロードされます)、そしてそこからパスを抽出できます。もしそれが本当にあなたが望むものなら、私はおそらくこれを行うためにコードを掘り下げることができます。必ずしもお勧めするわけではありません。
編集 user.homeプロパティは、安全に使用できるユーザーディレクトリを提供します。
INIファイルの代わりに.propertiesファイルを使用するのは良い考えです。また、機密データをそこに保存する場合は、暗号化を検討できます。これをチェックしてください:
https://www.owasp.org/index.php/How_to_encrypt_a_properties_file
またはこれ: