Özellikler dosyalarında eşittir işaretinden nasıl çıkılır


85

=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:


84

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 \rve \nkaçış 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.


92

Ö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.


12
bunun neden işaretlenmediğini bilmiyorum! En basit doğru cevap! Ve çoğu zaman insanlar özellikler dosyasında kaçan değer arıyorlar!
Tejas

1
Küçük düzeltme: ilk çıkış karaktersiz eşitler ve sondaki boşluklardan sonraki tüm karakterlere değer olarak davranılır, yani değerdeki baştaki boşluklar çıkarılır. Örnek "myKey = benim değerim", "myKey = değerim" ile aynıdır.
Paulo Merson

25

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.


8
önde gelen boşluk hariç (oh ve anahtar ile değer arasındaki '=' gerekli değildir, olabilir: veya boşluk olabilir)
Brad Cupit

16

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.


6

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


İkinci olarak, iki ters eğik
çizgiye


2

Spring veya Spring boot application.properties dosyasında özel karakterlerden kaçmanın yolu burada;

table.whereclause = nerede id '\ =' 100


0

Bu yöntem, .propertiesdosyalarla % 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.


-1

"Karakterine değer girebildim:

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

Neden olumsuz oy kullanıyorsunuz? Bu gerçek bir cevap :)
russellhoff

Op, Java özelliklerinin java özellik dosyalarında bu şekilde çalışmadığını söylüyor.
teknopaul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.