Какой самый эффективный способ заменить множество строковых токенов во многих файлах в Java? - PullRequest
0 голосов
/ 11 августа 2009

То, что я хочу сделать, - это инструмент, который фильтрует мои файлы, заменяя вхождения строк в этом формате ${some.property} значением, полученным из файла свойств (так же, как функция фильтрации файлов Maven или Ant).

Моим первым подходом было использование Ant API (copy-task) или компонента Maven Filtering, но оба они включают много ненужных зависимостей, и моя программа должна быть легкой. После чего я немного искал в Apache Common, пока ничего не нашел.

Есть ли эффективное (и элегантное) решение моей проблемы?

Ответы [ 3 ]

2 голосов
/ 11 августа 2009

Наиболее эффективным решением является использование шаблонизатора. Есть несколько широко используемых двигателей, которые поставляются в одной банке:

1 голос
/ 11 августа 2009

Если это связано с конфигурацией, я бы порекомендовал Конфигурация Apache Commons . Он сделает замену на лету.

У него есть и другие полезные функции, такие как обработка XML, свойства, форматы Apple pList.

0 голосов
/ 12 августа 2009

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

Предлагаемый алгоритм:

Начните с загрузки файла свойств в объект Properties.

Возьмите средство чтения ввода (используйте BufferedReader, если вы будете читать файлы из источника с высокой задержкой) и захватите каждый символ в поисках {. Если символ не является {, выведите символ в выходной поток. Если вы нашли {, начните поиск для}, накапливая символы в StringBuilder. Если вы нажмете другой {, сбросьте StringBuilder в выходной поток и начните сначала. Возможно, вы захотите иметь максимальное количество символов, которое вы разрешаете указывать ключу свойства. Если вы достигнете этого предела, сбросьте StringBuilder в выходной поток.

Если вы найдете токен в окружении {}, возьмите имя ключа и выполните вызов Properties # getProperty (). Если вы получите результат, отправьте результат в выходной поток. Если вы не получите результат, сделайте что-то другое.

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

Если вы действительно стремитесь к производительности, вы можете использовать ByteBuffer вместо входного потока / устройства записи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...