プロパティファイルの等号をエスケープする方法


84

=Javaプロパティファイルの等号()をエスケープするにはどうすればよいですか?次のようなものをファイルに入れたいと思います。

table.whereclause=where id=100

回答:


83

また、javadocのクラスからload(Readerreader)メソッドを参照してください。Property

ではload(Reader reader)メソッドのドキュメントは言います

キーには、最初の空白以外の文字から始まり、行末記号'='以外の最初のエスケープされていない、、、':'または空白文字までの行のすべての文字が含まれ ます。これらのキー終了文字はすべて、前に円記号を付けてエスケープすることにより、キーに含めることができます。例えば、

\:\=

2文字のキーになります。":=". ラインターミネータ文字は\r\nエスケープシーケンスを使用して含めることができます。キーの後の空白はスキップされます。キーの後の最初の非空白文字が'=' またはの場合':'、それは無視され、その後の空白文字もスキップされます。行の残りのすべての文字は、関連する要素文字列の一部になります。残りの文字がない場合、要素は空の文字列""です。キーと要素を構成する生の文字シーケンスが識別されると、上記のようにエスケープ処理が実行されます。

お役に立てば幸いです。


89

あなたの特定の例では、equalsをエスケープする必要はありません-それがキーの一部である場合にのみエスケープする必要があります。プロパティファイル形式は、最初のエスケープされていない等しい後のすべての文字を値の一部として扱います。


12
なぜこれがマークアップされていないのかわからない!最も簡単な正解!そして、ほとんどの場合、人々はプロパティファイルで値をエスケープすることを探しています!
テハス2013

1
小さな修正:最初のエスケープされていない等号と末尾のスペース、つまり値の先頭のスペースが削除された後、すべての文字を値として扱います。例「myKey = myvalue」は「myKey = myvalue」と同じです。
Paulo Merson 2017年

23

Javaのデフォルトのエスケープ文字は「\」です。
ただし、Javaプロパティファイルの形式はkey = valueであるため、最初の等しい後のすべてを値と見なす必要があります。


7
先頭の空白を除く(ああ、キーと値の間に「=」は必要ありません。:または空白である可能性があります)
Brad Cupit 2011

16

この種の問題を回避する最善の方法は、プログラムでプロパティを構築してから保存することです。たとえば、次のようなコードを使用します。

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

これは、適切にエスケープされたバージョンをSystem.outに出力します。

私の場合、出力は次のとおりです。

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

ご覧のとおり、これは、正しいことが保証されている.propertiesファイルのコンテンツを生成する簡単な方法です。また、必要な数のプロパティを配置できます。


6

私の場合、2つの主要な「\\」が正常に機能しています。

例:単語に「#」文字が含まれている場合(例:aa#100の場合、先頭に2つの「\\」を付けてエスケープできます

   key= aa\\#100


次に

2

ここを見ることができますJavaプロパティのキーに空白文字を含めることはできますか?

エスケープ等しい '=' \ u003d

table.whereclause = where id = 100

キー:[table.whereclause]値:[whereid = 100]

table.whereclause \ u003dwhere id = 100

キー:[table.whereclause = where]値:[id = 100]

table.whereclause \ u003dwhere \ u0020id \ u003d100

キー:[table.whereclause = whereid = 100]値:[]


2

SpringまたはSpringブートのapplication.propertiesファイルでは、ここに特殊文字をエスケープする方法があります。

table.whereclause = where id '\ =' 100


0

この方法は、.propertiesファイルと100%互換性があることが保証された値をプログラムで生成するのに役立ちます。

public static String escapePropertyValue(final String value) {
    if (value == null) {
        return null;
    }

    try (final StringWriter writer = new StringWriter()) {
        final Properties properties = new Properties();
        properties.put("escaped", value);
        properties.store(writer, null);
        writer.flush();

        final String stringifiedProperties = writer.toString();
        final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
        final Matcher matcher = pattern.matcher(stringifiedProperties);

        if (matcher.find() && matcher.groupCount() <= 2) {
            return matcher.group(matcher.groupCount());
        }

        // This should never happen unless the internal implementation of Properties::store changed
        throw new IllegalStateException("Could not escape property value");
    } catch (final IOException ex) {
        // This should never happen. IOException is only because the interface demands it
        throw new IllegalStateException("Could not escape property value", ex);
    }
}

あなたはそれをこのように呼ぶことができます:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

この方法は少し高価ですが、ファイルへのプロパティの書き込みは通常、とにかく散発的な操作です。


-1

文字「:」内に値を入力することができました

db_user="postgresql"
db_passwd="this,is,my,password"

なぜ反対票を投じるのですか?それは本当の答えです:)
russellhoff 2016

Opは、Javaプロパティについて述べていますが、引用符はJavaプロパティファイルではそのようには機能しません。
teknopaul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.