2012-01-08 2 views
1

Недавно я узнал о java.util.Properties, что позволяет мне писать и читать из конфига без написания моей собственной функции.Как изменить символ разделителя Properties.store() с "=" на ":"?

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

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

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

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

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

+0

Это довольно хорошая идея, я просто буду использовать Свойства, чтобы прочитать файл и FileWriter, чтобы сохранить его обратно, спасибо, что попробуете его сейчас. – user1137183

+0

Однако проверьте, как Properties.saveConvert() и loadConvert() выходят из специальных символов. Это может быть серьезной проблемой для вас. – user949300

0

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

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


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

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

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

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

Смежные вопросы