=
Java özellik dosyalarında eşittir işaretinden ( ) nasıl kaçabilirim ? Dosyama aşağıdaki gibi bir şey koymak istiyorum:
table.whereclause=where id=100
Yanıtlar:
Ayrıca, lütfen javadoc üzerindeki sınıftan load (Reader reader) yöntemine bakın.Property
Gelen load(Reader reader)
yöntem belgelerine diyor
Anahtar olmayan ilk beyaz boşluk karakteri ile ve kadar başlangıç satırında karakter tümünü içeren, ancak, ilk çıkmamış hariç
'='
,':'
veya hat terminatör dışındaki beyaz boşluk karakteri. Bu anahtar sonlandırma karakterlerinin tümü, onlardan önceki ters eğik çizgi karakteriyle önlenerek anahtara dahil edilebilir; Örneğin,\:\=
iki karakterli anahtar olabilir
":=".
Satır sonlandırıcı karakterler kullanılarak\r
ve\n
kaçış dizileri eklenebilir . Tuş atlandıktan sonra herhangi bir beyaz boşluk; tuştan sonraki ilk beyaz olmayan boşluk karakteri'='
veya ise':'
, o zaman yok sayılır ve ondan sonraki beyaz boşluk karakterleri de atlanır. Satırdaki kalan tüm karakterler ilişkili öğe dizesinin parçası olur; kalan karakter yoksa, öğe boş dizedir""
. Anahtarı ve öğeyi oluşturan ham karakter dizileri tanımlandıktan sonra, kaçış işlemi yukarıda açıklandığı gibi gerçekleştirilir.
Umarım yardımcı olur.
Özel örneğinizde, eşitlerden kaçmanıza gerek yoktur - yalnızca anahtarın bir parçasıysa ondan kaçmanız gerekir. Özellikler dosya biçimi, ilk çıkış karaktersiz eşitten sonraki tüm karakterleri değerin bir parçası olarak değerlendirir.
Java'daki varsayılan çıkış karakteri "\" dir.
Bununla birlikte, Java özellikler dosyası anahtar = değer biçimine sahiptir, ilk eşit değerden sonraki her şeyi dikkate almalıdır.
Bu tür sorunları önlemenin en iyi yolu, özellikleri programlı olarak oluşturmak ve sonra bunları depolamaktır. Örneğin, bunun gibi bir kod kullanmak:
java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);
Bu, System.out'a uygun şekilde kaçan sürümün çıktısını alacaktır.
Benim durumumda çıktı:
#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100
Gördüğünüz gibi, bu, doğru olduğu garanti edilen .properties dosyalarının içeriğini oluşturmanın kolay bir yoludur. Ve istediğiniz kadar mülk koyabilirsiniz.
Benim durumumda, iki lider '\\' benim için iyi çalışıyor.
Örneğin: kelimeniz '#' karakterini içeriyorsa (örneğin, aa # 100, başındaki iki '\\' ile ondan kaçabilirsiniz.
key= aa\\#100
Buraya bakabilirsiniz Java özelliğindeki anahtar boş bir karakter içerebilir mi?
kaçış eşitliği için '=' \ u003d
table.whereclause = id = 100
anahtar: [table.whereclause] değer: [id = 100]
table.whereclause \ u003dwhere id = 100
anahtar: [table.whereclause = burada] değer: [id = 100]
table.whereclause \ u003dwhere \ u0020id \ u003d100
anahtar: [table.whereclause = id = 100] değer: []
Bu yöntem, .properties
dosyalarla % 100 uyumlu olması garantili değerlerin programlı olarak oluşturulmasına yardımcı olmalıdır :
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);
}
}
Şöyle diyebilirsiniz:
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
Bu yöntem biraz pahalıdır, ancak bir dosyaya özellik yazmak genellikle düzensiz bir işlemdir.
"Karakterine değer girebildim:
db_user="postgresql"
db_passwd="this,is,my,password"