=
Javaプロパティファイルの等号()をエスケープするにはどうすればよいですか?次のようなものをファイルに入れたいと思います。
table.whereclause=where id=100
回答:
また、javadocのクラスからload(Readerreader)メソッドを参照してください。Property
ではload(Reader reader)
メソッドのドキュメントは言います
キーには、最初の空白以外の文字から始まり、行末記号
'='
以外の最初のエスケープされていない、、、':'
または空白文字までの行のすべての文字が含まれ ます。これらのキー終了文字はすべて、前に円記号を付けてエスケープすることにより、キーに含めることができます。例えば、\:\=
2文字のキーになります。
":=".
ラインターミネータ文字は\r
、\n
エスケープシーケンスを使用して含めることができます。キーの後の空白はスキップされます。キーの後の最初の非空白文字が'='
またはの場合':'
、それは無視され、その後の空白文字もスキップされます。行の残りのすべての文字は、関連する要素文字列の一部になります。残りの文字がない場合、要素は空の文字列""
です。キーと要素を構成する生の文字シーケンスが識別されると、上記のようにエスケープ処理が実行されます。
お役に立てば幸いです。
あなたの特定の例では、equalsをエスケープする必要はありません-それがキーの一部である場合にのみエスケープする必要があります。プロパティファイル形式は、最初のエスケープされていない等しい後のすべての文字を値の一部として扱います。
Javaのデフォルトのエスケープ文字は「\」です。
ただし、Javaプロパティファイルの形式はkey = valueであるため、最初の等しい後のすべてを値と見なす必要があります。
この種の問題を回避する最善の方法は、プログラムでプロパティを構築してから保存することです。たとえば、次のようなコードを使用します。
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ファイルのコンテンツを生成する簡単な方法です。また、必要な数のプロパティを配置できます。
私の場合、2つの主要な「\\」が正常に機能しています。
例:単語に「#」文字が含まれている場合(例:aa#100の場合、先頭に2つの「\\」を付けてエスケープできます
key= aa\\#100
ここを見ることができます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]値:[]
この方法は、.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"
この方法は少し高価ですが、ファイルへのプロパティの書き込みは通常、とにかく散発的な操作です。
文字「:」内に値を入力することができました
db_user="postgresql"
db_passwd="this,is,my,password"