2016-10-03 2 views
0

Я прочитал и попытался следующиеКак удалить обратный слеш из значения свойств в Java

и многие блог, как хорошо, но все для удаления из строки не для свойств файла

I пытаюсь удалить \ от значения свойства файла, но не повезло

Вот мой config.properties файл

query=select * from users 
field=id 

и мой Java код, который A.java является

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Properties; 

public class A { 

    public static void main(String[] args) throws IOException { 
     String configPath = "/home/arif/util-test/config.properties"; 
     Properties prop = new Properties(); 
     FileInputStream configFileInputStream = new FileInputStream(configPath); 
     prop.load(configFileInputStream); 
     System.out.println("Property file loaded "+ configPath); 
     configFileInputStream.close(); 
     String query = prop.getProperty("query"); 
     query += " where " + prop.getProperty("field") + " = 1"; 
     //query = query.replaceAll("\\\\", ""); 
     query = query.replace("\\", ""); 
     prop.replace("query", query); 
     prop.store(new FileOutputStream(configPath), null); 
     System.out.println("updated query="+ query); 
    } 

} 

и обновленный config.properties файл

#Mon Oct 03 14:34:27 IST 2016 
query=select * from users where id \= 1 
field=id 

в то время как я ожидал следующий

#Mon Oct 03 14:34:27 IST 2016 
query=select * from users where id = 1 
field=id 

и получить ожидаемый результат от терминала или ЦМД, терминальный вывод

Property file loaded /home/arif/util-test/config.properties 
updated query=select * from users where id = 1 

ваша помощь будет оценен по достоинству! спасибо

+0

@PeterLawrey, вы читали вопрос перед маркировкой дубликата? –

+2

@PeterLawrey здесь не то же самое, проблема заключается в том, что '=' является специальным символом в файле свойств, поскольку он используется для разрезания ключа и значения заданного свойства, так что он всегда будет экранирован с помощью обратная косая черта, но она полностью прозрачна для конечного пользователя, так как вызов getProperty («query») 'будет возвращать значение без обратного слэша. –

+0

Почему вы хотите удалить обратную косую черту, поскольку она прозрачна для вас? это только деталь реализации –

ответ

1

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

Из Javadoc для Properties

Всех этих ключевых символов терминации может быть включен в ключе, убегая их с предшествующим символом обратного косым; например,

\:\= 

Этой линия

query=select * from users where id = 1 

не действуют, поскольку она содержит две неэкранированных = символов. Второе нужно избегать.

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

Альтернативными способами хранения свойств являются XML, JSON и YAML. Я предпочитаю YAML, который, как правило, проще/чище читать.

Spec для YAML http://www.yaml.org/spec/1.2/spec.html

Java библиотека для YAML https://bitbucket.org/asomov/snakeyaml Это хорошая библиотека для конфигурации. Я бы начал с этого.

+1

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

+0

@ Свойства ArifKhan были разработаны для Java 1.0 и были встроены, но дамп. –

+0

@ArifKhan добавил некоторые ссылки. –