web-dev-qa-db-ja.com

プロパティファイルでコロン(:)をどのようにエスケープしますか?

プロパティファイルを使用して、アプリケーションの構成値を保存しています。いずれかのインスタンスで、値をxxx:yyy:zzzとして保存する必要があります。そうすると、コロンがバックスラッシュ\でエスケープされ、プロパティファイルで値がxxx\:yyy\:zzzとして表示されます。

コロン:Properties Javaクラスの標準の区切り文字であることを認識しています。ただし、バックスラッシュなしで値を保存する必要があります\

これを処理する方法について何か提案はありますか?

19
indiws

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

"...キーの場合、すべての空白文字は先行する\文字で記述されます。要素の場合、先行空白文字は埋め込まれますが、後続空白文字は先行する\で記述されません文字。キーと要素の文字#、!、=、および:は、適切にロードされるように、前にバックスラッシュを付けて書き込まれます。 "

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


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

17
Stephen C

私は同じ問題に出くわしました。スラッシュ_/_もPropertiesstore()メソッドによってエスケープされます。

独自のCustomPropertiesクラス(_Java.util.Properties_を拡張)を作成し、saveConvert()メソッドのcustomStore0()への呼び出しをコメント化することで、この問題を解決しました。

これが私のCustomPropertiesクラスです:

_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();
  }
}
_
5
Patrick Kiernan

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

危険ですが、プロパティ値が40文字未満の場合は、「store」の代わりに「list」メソッドを使用できます。

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();
}
3
Dave Patterson

その単純な、ただアポストロフィ''を使用するだけです。例:

これの代わりに(ケース1)

File file= new File("f:\\properties\\gog\\esave\\Apple");
prop.setProperty("basedir",file.toString());

これを使用(ケース2)

File file= new File("f':'\\properties\\gog\\esave\\Apple");
prop.setProperty("basedir",file.toString());

出力は


ケース1:basedir = f:\ properties\gog\esave\Apple

ケース2:basedir = f:\ properties\gog\esave\Apple

これがお役に立てば幸いです

1
Venkatesh A

プロパティファイルのxmlバリアントを使用する場合(loadFromXMLおよびstoreToXMLを使用)、これは問題になりません。

1
trutheality

Unicodeを使用してみてください。

コロンのユニコードはis\u003A

さらに、スペースのユニコードは次のとおりです:\u0020

基本的なラテン文字のリストについては、次を参照してください: https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)

例:

ProperName\u003A\NameContinues=Some property value

キーを持つプロパティを期待します:

ProperName:NameContinues

そして、次の値になります:

Some property value

0
jspek