2011-10-18 13 views
0

私は自分のクラスパスにあるプロパティファイルを持っています。私の要求は、引数から得られるいくつかの入力に基づいて、このファイルのいくつかのプロパティを変更することです。引数の性質は、プロパティを変更する必要があるかどうかを決定し、変更する場合はどのプロパティを変更するかを決定します。問題は、すべてのクラスパスエントリがアプリケーションの起動時にロードされるため、アプリケーション内から変更することは効果がないことです。どうすればこの問題を解決できますか?クラスパスにあるプロパティファイルを変更する方法はありますか?

考えられる解決策の1つは、このプロパティファイルをクラスパスに追加するのではなく、変更が完了した後に追加することです。それは実行可能ですか?何が良い解決策になりますか?

答えて

1

このファイルがクラスパス上にあるかどうかは関係ありません。ファイルです:内容を上書きすると、変更されます。起動時に魔法のように作成されるメモリ内コピーはありません。これは、ロードされ、実行時に変更が必要なクラスとは非常に異なります。

適切な形式のプロパティファイルは、java.util.Propertiesオブジェクトに読み込むことができます。あなたはそれを行い、必要に応じてオブジェクトを使ってプロパティを変更し、それをファイルに書き戻すことができます。そのクラスのstoreloadのメソッドを確認してください。 Output/InputStreamのバージョンを使用すると、エンコードがハードコードされていることに注意してください。ファイルのエンコーディングがISO-8859-1以外の場合は、適切なWriter/Readerのメソッドを使用します。ここで

0

はサンプルコードです:

Properties p = new Properties(); 
File f = new File("file"); 
InputStream in = new FileInputStream(f); 
p.load(in); 
p.put("key", "blah"); 

OutputStream out = new FileOutputStream(f); 
// If no comments p.store(writer); 
p.store(out, "properties"); 
0

あなたが最初にそれをプロパティファイルからそのプロパティを削除して再定義する必要があります。彼らは直接プロパティファイルを変更する方法はありません。以下は

は一例です:

Properties pproperties = new Properties(); 

    if (properties.containsKey("key1")) { 

         properties.remove("key1"); 
         properties.setProperty("key1", "value1"); 
         properties.store(new FileOutputStream("file.properties"), null); 
        } 
1

は、アプリケーションが配備されている方法によって異なります。プロパティーファイルがjarファイル内にある場合、そのプロパティーファイルはアーカイブにパッケージ化されて圧縮されてから直接変更することはできません。他の誰かがそれらのプロパティをオブジェクトにロードしてから、おそらくURLベースの場所である外部の場所に保存/書き出すことができます。 URLは事実上どの場所にもアクセスでき、プロパティをロードするための気の利いたopenStream()メソッドがあるので便利です。アプリケーションは読み込み時に新しいファイルを検索し、新しい場所からの読み込み/読み込みに失敗した場合は、アプリケーションの起動バージョンをデフォルトにすることができます。

+0

はい私のユーティリティはjarファイルにパッケージ化されます。だから私は別の場所(tempが望ましい)にファイルをコピーしようとしているし、そこに変更します –