2012-05-22 5 views
15

プロパティファイルを使用してアプリケーションの設定値を保存しています。 インスタンスの1つで、値を xxx:yyy:zzzとして保存する必要があります。これを行うと、コロンはバックスラッシュ\でエスケープされ、結果としてプロパティファイルにxxx\:yyy\:zzzという値が表示されます。プロパティファイルでコロン(:)をエスケープしますか?

コロン:は、Properties Javaクラスの標準区切り文字です。しかし、私はまだバックスラッシュなしで値を保存する必要があります\

これを処理する方法についてのご意見はありますか?

+1

は、ここに私のCustomPropertiesクラスです。さもなければ、あなたの "コロン"を混乱させずにプロパティファイルをどのように読み返すことができ、コロンはキー値の区切りに使うことができますか? – ewernli

+0

StringWriterを作成し、その中にプロパティファイルを書き、バッファを1行ずつ探して ':\ 'を探し、それを単一の' ':' 'で置き換えます。これはきれいではありませんが、あなたがやろうとしていることもまたそれほど美しくありません。 – dasblinkenlight

+1

@BhavikAmbani「*正規表現を使用する」*プロパティファイルを保存するときに正規表現を指定する場所は正確ですが、REはどのように見えますか? – EJP

答えて

16

Propertiesオブジェクトにプロパティを入れ、store(...)メソッドを使用して保存します。このメソッドは、必要なエスケープ処理を実行します。 Java documentationは言う:。

」...キーについては、すべての空白文字が埋め込まれたか、空白文字を末尾のスペース文字をリードし、要素については、先行する\文字で書かれていますが、されていないが、と書かれていますキーと要素の文字#、!、=、および:は、それらが正しく読み込まれるように先行するバックスラッシュで書き込まれます。

手作業でファイルを作成または書き込む場合は、手動でエスケープする必要があります。


逆に、ファイルにエスケープされていないコロン文字が含まれている場合、あなたは不運です。このようなファイルは不正な形式であり、おそらくProperties.load(...)メソッドを使用して正しく読み込まれません。このルートを下る場合は、独自のカスタムロードおよび/またはストアメソッドを実装する必要があります。

1

loadFromXMLstoreToXMLを使用して)プロパティファイルのxmlバリアントを使用する場合、これは問題ではありません。

+0

私はこのアプローチも好きですが、XMLフォーマットはnoobs( "customers etc")のために読みにくいです...私はエスケープする方法があるべきだと思っています。あるいは、いくつかのutilを使ってキー値デリミタを選択するか今:区切り文字としても使われています... –

2

この質問は数日前にヒットしました。私たちはURLを値として持つ既存のプロパティファイルを操作していました。

それは危険なのですが、あなたのプロパティの値が40文字未満であれば、あなたの代わりに「ストア」の「リスト」方式を使用することができます。

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)

私たちは、JDKコードで簡単に見ていたし、

public void store(Properties props, String propertyFilePath) throws FileNotFoundException { 
    PrintWriter pw = new PrintWriter(propertyFilePath); 
    for (Enumeration e = props.propertyNames(); e.hasMoreElements();) { 
     String key = (String) e.nextElement(); 
     pw.println(key + "=" + props.getProperty(key)); 
    } 
    pw.close(); 
} 
5

私は同じ問題を抱えていました。スラッシュ/ものstore()メソッドでエスケープします。

私は(java.util.Propertiesを拡張)私自身のCustomPropertiesクラスを作成し、customStore0()方法でsaveConvert()への呼び出しをコメントアウトすることで、この問題を解決しました。私はあなたができない恐れ

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.Properties; 

public class CustomProperties extends Properties { 
    private static final long serialVersionUID = 1L; 
    @Override 
    public void store(OutputStream out, String comments) throws IOException { 
     customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")), 
        comments, true); 
    } 
    //Override to stop '/' or ':' chars from being replaced by not called 
    //saveConvert(key, true, escUnicode) 
    private void customStore0(BufferedWriter bw, String comments, boolean escUnicode) 
      throws IOException { 
     bw.write("#" + new Date().toString()); 
     bw.newLine(); 
     synchronized (this) { 
      for (Enumeration e = keys(); e.hasMoreElements();) { 
       String key = (String) e.nextElement(); 
       String val = (String) get(key); 
       // Commented out to stop '/' or ':' chars being replaced 
       //key = saveConvert(key, true, escUnicode); 
       //val = saveConvert(val, false, escUnicode); 
       bw.write(key + "=" + val); 
       bw.newLine(); 
      } 
     } 
     bw.flush(); 
    } 
} 
関連する問題