Как вы удаляете двоеточие (:) в файле свойств?

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

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

Любые предложения по управлению этим?

Ответы

Ответ 1

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

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

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


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

Ответ 2

Я столкнулся с той же проблемой. Прямые косые черты / также получают escape-код методом 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();
  }
}

Ответ 3

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

Это рискованно, но если ваши значения свойств меньше 40 символов, вы можете использовать метод "list" вместо "store":

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

Ответ 4

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

Ответ 5

Просто, просто используйте Apostrophe '' там. Eg:

Вместо этого (случай 1)

File file= new File("f:\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",flie.toString());

Используйте это (случай 2)

File file= new File("f':'\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",flie.toString());

Выход будет


Случай 1: basedir = f:\properties\gog\esave\apple

Случай 2: basedir = f:\properties\gog\esave\apple

Я надеюсь, что это поможет вам