Introdução às propriedades Java

Introdução às propriedades Java

*1. Visão geral *

A maioria dos aplicativos Java precisa usar propriedades em algum momento, geralmente para armazenar parâmetros simples como pares de valor-chave, fora do código compilado.

E assim o idioma tem suporte de primeira classe para propriedades - o java.util.Properties - uma classe de utilitário projetada para manipular esse tipo de arquivo de configuração.

É nisso que vamos nos concentrar neste artigo.

===* 2. Carregando propriedades *

====* 2.1 Dos arquivos de propriedades *

Vamos começar com um exemplo para carregar pares de valores-chave a partir de arquivos de propriedades; estamos carregando dois arquivos que temos disponíveis em nosso caminho de classe:

app.properties:

version=1.0
name=TestApp
date=2016-11-12

E catalog:

c1=files
c2=images
c3=videos

Observe que, embora os arquivos de propriedades sejam recomendados para usar ".properties", o sufixo, não é necessário.

Agora podemos carregá-los de maneira muito simples em uma instância Properties:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "app.properties";
String catalogConfigPath = rootPath + "catalog";

Properties appProps = new Properties();
appProps.load(new FileInputStream(appConfigPath));

Properties catalogProps = new Properties();
catalogProps.load(new FileInputStream(catalogConfigPath));


String appVersion = appProps.getProperty("version");
assertEquals("1.0", appVersion);

assertEquals("files", catalogProps.getProperty("c1"));

Desde que o conteúdo de um arquivo atenda aos requisitos de formato de arquivo de propriedades, ele poderá ser analisado corretamente pela classe Properties. Aqui estão mais detalhes para Formato de arquivo de propriedade.

====* 2.2 Carregar de arquivos XML *

Além dos arquivos de propriedades, a classe Properties também pode carregar arquivos XML em conformidade com as especificações específicas da DTD.

Aqui está um exemplo para carregar pares de valores-chave de um arquivo XML - icons.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>xml example</comment>
    <entry key="fileIcon">icon1.jpg</entry>
    <entry key="imageIcon">icon2.jpg</entry>
    <entry key="videoIcon">icon3.jpg</entry>
</properties>

Agora, vamos carregá-lo:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String iconConfigPath = rootPath + "icons.xml";
Properties iconProps = new Properties();
iconProps.loadFromXML(new FileInputStream(iconConfigPath));

assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));

===* 3. Obter propriedades *

Podemos usar _getProperty (chave String) _ e _getProperty (chave String, String defaultValue) _ para obter valor por sua chave.

Se o par de valores-chave existir, os dois métodos retornarão o valor correspondente. Mas se não houver esse par de valores-chave, o primeiro retornará nulo e o segundo retornará defaultValue.

Código de exemplo:

String appVersion = appProps.getProperty("version");
String appName = appProps.getProperty("name", "defaultName");
String appGroup = appProps.getProperty("group", "");
String appDownloadAddr = appProps.getProperty("downloadAddr");

assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("", appGroup);
assertNull(appDownloadAddr);

Observe que, embora a classe Properties herda o método get () _ da classe _Hashtable, eu não recomendo que você o utilize para obter valor. Como o método get () _ retornará um valor _Object que só pode ser convertido em String e o método getProperty () _ já lida com o valor bruto de _Object corretamente para você.

O código abaixo lançará uma Exception:

float appVerFloat = (float) appProps.get("version");

===* 4. Definir propriedades *

Podemos usar o método _setProperty () _ para atualizar um par de valores-chave existente ou adicionar um novo par de valores-chave.

Código de exemplo:

appProps.setProperty("name", "NewAppName");//update an old value
appProps.setProperty("downloadAddr", "www..com/downloads");//add new key-value pair

String newAppName = appProps.getProperty("name");
assertEquals("NewAppName", newAppName);

String newAppDownloadAddr = appProps.getProperty("downloadAddr");
assertEquals("www..com/downloads", newAppDownloadAddr);

Observe que, embora a classe Properties herda o método put () _ e o método _putAll () _ da classe _Hashtable, não recomendo que você os use pelo mesmo motivo do método get () _: somente os valores _String podem ser usados ​​em Properties.

O código abaixo não funcionará como você deseja, quando você usar getProperty () _ para obter seu valor, ele retornará _null:

appProps.put("version", 2);

===* 5. Remover propriedades *

Se você deseja remover um par de valores-chave, pode usar o método _remove () _.

Código de exemplo:

String versionBeforeRemoval = appProps.getProperty("version");
assertEquals("1.0", versionBeforeRemoval);

appProps.remove("version");
String versionAfterRemoval = appProps.getProperty("version");
assertNull(versionAfterRemoval);

===* 6. Loja *

====* 6.1 Armazenar em arquivos de propriedades *

A classe Properties fornece um método _store () _ para gerar pares de valores-chave.

Código de exemplo:

String newAppConfigPropertiesFile = rootPath + "newApp.properties";
appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");

O segundo parâmetro é para comentar. Se você não quiser escrever nenhum comentário, basta usar nulo.

====* 6.2 Armazenar em arquivos XML *

A classe Properties também fornece um método _storeToXML () _ para gerar pares de valores-chave no formato XML.

Código de exemplo:

String newAppConfigXmlFile = rootPath + "newApp.xml";
appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");

O segundo parâmetro é igual ao método _store () _.

===* 7. Outras operações comuns *

A classe Properties também fornece alguns outros métodos para operar as propriedades.

Código de exemplo:

appProps.list(System.out);//list all key-value pairs

Enumeration<Object> valueEnumeration = appProps.elements();
while (valueEnumeration.hasMoreElements()) {
    System.out.println(valueEnumeration.nextElement());
}

Enumeration<Object> keyEnumeration = appProps.keys();
while (keyEnumeration.hasMoreElements()) {
    System.out.println(keyEnumeration.nextElement());
}

int size = appProps.size();
assertEquals(3, size);

===* 8. Lista de propriedades padrão *

Um objeto Properties pode conter outro objeto Properties como sua lista de propriedades padrão. A lista de propriedades padrão será pesquisada se a chave de propriedade não for encontrada na original.

Além de "app.properties", temos outro arquivo - "default.properties" - em nosso caminho de classe:

default.properties:

site=www.google.com
name=DefaultAppName
topic=Properties
category=core-java

Código de exemplo:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();

String defaultConfigPath = rootPath + "default.properties";
Properties defaultProps = new Properties();
defaultProps.load(new FileInputStream(defaultConfigPath));

String appConfigPath = rootPath + "app.properties";
Properties appProps = new Properties(defaultProps);
appProps.load(new FileInputStream(appConfigPath));

assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("www.google.com", defaultSite);

9. Propriedades e codificação

Por padrão, espera-se que os arquivos de propriedades sejam codificados em ISO-8859-1 (latino-1), portanto, propriedades com caracteres fora da ISO-8859-1 geralmente não devem ser usadas.

Podemos contornar essa limitação com a ajuda de ferramentas como a ferramenta native2ascii do JDK ou codificações explícitas em arquivos, se necessário.

Para arquivos XML, o método _loadFromXML () _ e o método _storeToXML () _ usam a codificação de caracteres UTF-8 por padrão.

No entanto, ao ler um arquivo XML codificado de maneira diferente, podemos especificar isso na declaração DOCTYPE; a escrita também é flexível o suficiente - podemos especificar a codificação em um terceiro parâmetro da API _storeToXML () _.

10. Conclusão

Neste artigo, discutimos o uso básico da classe Properties, incluindo como usar Properties carregar e armazenar pares de valores-chave nas propriedades e no formato XML, como operar pares de valores-chave em um objeto Properties, como recuperar valores, atualizar valores , obtenha seu tamanho e como usar uma lista padrão para um objeto Properties.

O código fonte completo do exemplo está disponível neste GitHub project.