0

Mac Application Bundle にパッケージ化する Java アプリがあります (すべてのアプリを含むが、ユーザーには単一の実行可能ファイルのように見えるフォルダー構造)。

私の問題: ローカル フォルダー (".") でいくつかの構成ファイルを読み書きしています。ただし、Mac では、これはアプリケーション バンドルが配置されているフォルダーのようです (したがって、通常は「アプリケーション」フォルダーであり、明らかにそれは望ましくありません。

私の質問: そのバンドル内にファイルを保存するにはどうすればよいですか? バンドル名をプログラムで取得して、完全修飾フォルダーを計算するにはどうすればよいですか?

ClassLoader の方法を試すことができることはわかっていますが、それは避けたいと思います (セキュリティ上の理由から)。

または、アプリケーションのキャッシュと構成データをローカルに保存するより良い方法はありますか?

4

2 に答える 2

1

わかりました、基本的な答え/解決策は次のとおりです。それをしないでください。

私が最初にそうしたかった理由は、ローカル HD に大量のデータをキャッシュすることでした。Java プリファレンスは構成データ (つまり、少量のデータ) には適していますが、メガバイト サイズ範囲のデータを処理することはできません。

私の解決策:

MacOSX ( System.getProperty("os.name").contains("Mac OS X")) では、ユーザーのホーム フォルダー ( System.getProperty("user.home")) にフォルダーを作成するだけです。そのフォルダーに接頭辞を付けて.、ユーザーから隠されるようにします。これにより、フォルダーへの書き込みアクセス権も確保されます (ユーザーがコピーする場所によっては、.app フォルダーで問題が発生する可能性があります)。

Windows ( System.getProperty("os.name").contains("Windows")) では、そのフォルダーをSystem.getenv("APPDATA")ディレクトリに作成します (この環境変数は Windows システムにのみ存在することに注意してください。

これで、ファイルシステムへのフル アクセスが可能になり (管理者権限がなくても)、好きなだけデータを保存できるようになりました。

于 2012-08-28T21:23:00.533 に答える
1

Mac OS X Finder は、名前が で終わるすべてのディレクトリをアプリケーション.appとして扱います。右クリックしてパッケージの内容を表示します。それ以外の場合は、I/O 目的の通常のディレクトリのままです。このプロジェクトは一例です。アプリケーションバンドルへの相対パスについては、この回答を参照してください。

補遺:アプリケーションのキャッシュと構成データをローカルに保存するより良い方法はありますか?

引用されたjava.util.prefs.Preferencesでは を使用していますが、これjavax.jnlp.PersistenceServiceの方法です。

于 2012-05-19T02:18:31.793 に答える