Как изменить символ делителя Properties.store () с "=" на ":"? - PullRequest
1 голос
/ 08 января 2012

Я недавно узнал о java.util.Properties, что позволяет мне писать и читать из конфига без написания для него собственной функции.

Я был взволнован, поскольку им так легко пользоваться, но позже я заметил недостаток, когда я сохранил измененный файл конфигурации.

Вот мой код, довольно простой на данный момент:

FileWriter writer = null;
Properties configFile = new Properties();
configFile.load(ReadFileTest.class.getClassLoader().getResourceAsStream("config.txt"));

String screenwidth = configFile.getProperty("screenwidth");
String screenheight = configFile.getProperty("screenheight");
System.out.println(screenwidth);
System.out.println(screenheight);
configFile.setProperty("screenwidth", "1024");
configFile.setProperty("screenheight", "600");
try {
    writer = new FileWriter("config.txt" );
    configFile.store(writer, null);
} catch (IOException e) {
    e.printStackTrace();
}
writer.flush();
writer.close();

Проблема, которую я заметил, заключалась в том, что файл конфигурации, который я пытаюсь редактировать, хранится так:

foo: bar
bar: foo
foobar: barfoo

Однако, вывод после properties.store(writer, null) таков:

foo=bar
bar=foo
foobar=barfoo

Файл конфигурации, который я редактирую, предназначен не для моей программы, а для другого приложения, которому требуется файл конфигурации в формате, показанном выше, с : в качестве разделителя, иначе он сбросит конфигурацию по умолчанию.

Кто-нибудь знает, как это легко изменить?

Я просмотрел первые 5 страниц Google сейчас, но не нашел никого с подобной проблемой. Я также проверил Javadoc и не нашел функции, которая позволила бы мне изменить его, не написав для себя класс. Я хотел бы использовать Properties на данный момент, так как он есть и довольно прост в использовании. У меня также появилась идея просто заменить все = на : после того, как я сохранил файл, но, может быть, кто-то получил лучшее предложение?

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Не используйте инструмент, который не предназначен для этой задачи - не используйте Properties здесь.Вместо этого я бы просто написал свой собственный - это должно быть достаточно просто.

Вы все еще можете использовать экземпляр Properties в качестве своего "хранилища", но не используйте его для сериализации свойств в текст.Вместо этого просто используйте FileWriter, переберите свойства и напишите строки самостоятельно - как key + ": " + value.

0 голосов
/ 28 января 2012

Новая идея здесь

Ваш комментарий о преобразовании = в: заставил меня задуматься : Properties.store () пишет в поток.Вы можете использовать ByteArrayOutputStream в памяти, соответствующим образом преобразовать в память перед тем, как записать в файл, а затем записать файл.Аналогично для Properties.load ().Или вы можете вместо этого вставить FilterXXXs.(Я бы, наверное, сделал это в памяти).


Я изучал, как трудно будет создать подкласс.Это почти невозможно.: - (

Если вы посмотрите на исходный код для свойств, (я смотрю на Java 6) store () вызывает store0 (). Теперь, к сожалению, store0 является частным, не защищенным, и "= "задается как магическая константа, а не что-то читаемое из свойства. И он вызывает другой закрытый метод saveConvert (), который также имеет много магических констант.

В целом, я оцениваю этот код как D-качество. Он нарушает почти все правила хорошего кода и хорошего стиля.

Но это открытый исходный код, поэтому теоретически вы можете скопировать и вставить (и улучшить!) кучу кода в свой собственный класс BetterProperties.

...