2012-05-22 3 views
15

Я использую файл свойств для хранения значений конфигурации моего приложения. В одном из экземпляров я должен сохранить значение как xxx:yyy:zzz. Когда я это делаю, двоеточие экранируется с обратной косой чертой \, в результате чего значение отображается как xxx\:yyy\:zzz в файле свойств.Как вам избежать двоеточия (:) в файле свойств?

Я знаю, что двоеточие : является стандартным разделителем класса Java Properties. Однако мне все равно нужно сохранить значение без обратной косой черты \.

Любые предложения относительно того, как с этим справиться?

+1

Я боюсь, что вы не можете.В противном случае, как файлы свойств могли быть прочитаны без путаницы «ваших» двоеточий, а двоеточие используют для разграничения значений ключа? – ewernli

+0

Создайте StringWriter, напишите в него свой файл свойств, перейдите в буфер по очереди, ища '' \: "', и заменив его на единственный '::'. Это некрасиво, но опять же то, что вы пытаетесь сделать, тоже не очень красиво. – dasblinkenlight

+1

@BhavikAmbani 'Использовать регулярные выражения' для этого * как? * Где именно вы получаете возможность указывать регулярное выражение при сохранении файла свойств и что именно будет выглядеть RE? – EJP

ответ

16

Поместите объекты в объект Properties и сохраните его, используя метод store(...). Метод выполнит любое требуемое экранирование. Java documentation говорит:.

»... Для ключа, все космические символы записываются с предшествующим символом \ Для элемента, ведущие пробелы, но не встроенные или конечные пробелы, написаны с предшествующий символ \. Символы ключа и элемента #,!, =, и: записываются с предыдущей обратной косой чертой, чтобы обеспечить их правильную загрузку. "

Вам нужно только вручную вывести символы, если вы создаете/записываете файл вручную.

И наоборот, если вы хотите, чтобы в файле содержались неэкранированные символы двоеточия, вам не повезло. Такой файл неверен и, вероятно, неправильно загружается с использованием методов Properties.load(...). Если вы спуститесь по этому маршруту, вам нужно будет реализовать свои собственные методы загрузки и/или хранения.

1

Если вы используете xml-вариант файла свойств (используя loadFromXML и storeToXML), это не должно быть проблемой.

+0

Мне тоже нравится этот подход, но формат XML немного сложнее читать для noobs («клиенты и т. Д.») ... Я думаю, что должен быть способ избежать: или использовать некоторые утилиты для выбора разделителя ключевых значений, так как теперь: также используется как разделитель ... –

2

Мы затронули этот вопрос пару дней назад. Мы манипулировали существующими файлами свойств с URL-адресами как значениями.

Это рискованно, но если ваши ценности собственности меньше, чем 40 символов, то вы можете использовать «список» метод вместо «магазин»:

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(); 
} 
5

Я столкнулся с той же проблемой. Прямые косые черты / также получают метод store() в Properties.

Я решил эту проблему, создав свой собственный CustomProperties класс (простирающейся 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(); 
    } 
} 
Смежные вопросы