22

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

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

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

4

8 に答える 8

20

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

"...キーの場合、すべてのスペース文字は前の\文字で書き込まれます。要素の場合、先頭のスペース文字は前の\文字で書き込まれますが、埋め込みまたは末尾のスペース文字は書き込まれません。キーと要素の文字#、 !、=、および:は、正しくロードされるように、前にバックスラッシュを付けて記述されています。」

ファイルを手動で作成/書き込みする場合にのみ、手動で文字をエスケープする必要があります。


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

于 2012-05-22T09:19:27.757 に答える
7

私は同じ問題に遭遇しました。スラッシュも。のメソッド/によってエスケープされます。store()Properties

この問題は、独自のCustomPropertiesクラス(extending )を作成し、メソッド内の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();
  }
}
于 2013-05-21T01:34:37.110 に答える
3

数日前にこの質問に答えました。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();
}
于 2012-07-03T19:43:33.890 に答える
1

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

于 2012-05-22T09:18:34.423 に答える
0

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

これの代わりに(ケース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

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

于 2018-07-02T08:47:29.577 に答える
0

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

コロンのUnicodeは\u003A

さらに、スペースのUnicodeは次のとおりです。\u0020

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

例えば:

ProperName\u003A\NameContinues=Some property value

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

ProperName:NameContinues

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

Some property value

于 2019-12-06T17:49:57.387 に答える
0

私にとっては、\特殊文字の前に使用して機能しました。

例えば、

Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration

:\:および (スペース)でエスケープされます\ \その後に<スペース>が続きます)。

詳細情報:https ://en.wikipedia.org/wiki/.properties

于 2020-07-03T09:16:05.887 に答える
0

Spring Boot構成プロパティファイルを使用するときにこのためにここに来る私のような人々のために:あなたはで囲む必要があります[..]

例えば:

my.test\:key=value

十分ではありません、あなたはあなたapplication.propertiesの例でこれを必要とします:

my.[test\:key]=value

SpringBoot2ConfigurationPropertiesも参照してくださいyamlキーからコロンを削除します

于 2021-01-08T08:56:02.180 に答える