Как вы удаляете двоеточие (:) в файле свойств?
Я использую файл свойств для хранения значений конфигурации приложения.
В одном из экземпляров я должен хранить значение как
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
Я надеюсь, что это поможет вам