Resgatar valor de um arquivo .properties

6 respostas
G

Pessoal, sabem se existe alguma forma fácil de pegar um valor contido em um arquivo .properties e utilizá-lo em um java bean?
Por exemplo, no meu .properties tenho:

mensagem=Erro ao gravar dados!

Quero pegar este valor e jogar em um atributo String por exemplo.

6 Respostas

T

Leia o javadoc da classe java.util.Properties. Ele tem um método “load” que serve para carregar todas as properties em um Map.

F

Leia um otimo tutorial da SUN

F

Gustavo,

Eu crio estas duas classes abaixo:

PropriedadesMd.java

import java.util.ResourceBundle;
import java.util.StringTokenizer;

/**
 *Esta classe obtem as informações contidas no arquivo de configuração do
 *sistema representadas num arquivo "properties".
 *Este arquivo é definido como "constantes.properties" e é responsavel pelas variáveis do
 *sistema, como caminhos de diretórios, drive's de bando de dados
 * 
 * 
 */

public class PropriedadesMd {

    private static ResourceBundle _bundle = null;

    
    /**
     * Obtem o arquivo de configurações no formato de leitura com a classe 
     * ResourceBundle
     * @return ResourceBundle configurado com o properties "constantes.properties"
     */
    private static ResourceBundle getResource() {
        if (_bundle == null){
            _bundle = ResourceBundle.getBundle(ConstantesMd.ARQUIVO_PROPERTIES);
        }
        return _bundle;
    }

    
    /**
     * Obtém o valor de chave no arquivo properties. 
     * Obs.: Neste arquivo a forma de representação dos dados
     * é feita como "key=value".
     * @param key chave com o valor para ser pesquisado no properties
     * @return string com o valor contido no arquivo
     */
    public static String getString(String key) {
        try {
            return getResource().getString(key);
        } catch (Exception e) {
            System.err.print(e.getMessage());
        	//SegurancaLog.registrarError(new PropriedadesMd() ,e.getMessage());
        }
        return null;
    }

    /**
     * Obtém o valor de chave no arquivo properties. Com uma função definida,
     * o retorno da valor é formatado com um StringTokenizer, separando este
     * valor um um array de String's pelo token ",".
     * 
     * Com este exemplo definido no properties de um value assim:
     * Exemplo: key=value, value2, value3
     * O retorno será de um array:
     * {"value", "value2", "value3"}
     * 
     * Obs.: Neste arquivo a forma de representação dos dados
     * é feita como "key=value".
     * @param key chave com o valor para ser pesquisado no properties
     * @return string com o valor contido no arquivo
     */
    public static String[] getStringArray(String key) {
    	String[] retorno = null;
    	try {
            String array = getResource().getString(key);
            StringTokenizer st = new StringTokenizer(array, ",");
            int tokens = st.countTokens();
            retorno = new String[tokens];

            for (int i = 0; i < tokens; i++) {
                retorno[i] = st.nextToken();
            }
            
        } catch (Exception e) {
            System.err.print(e.getMessage());            
        	//SegurancaLog.registrarError(new PropriedadesMd() ,e.getMessage());
            retorno =  null;
        }
        return retorno;
    }

    /**
     * Obtém o valor de chave no arquivo properties no formato de um integer. 
     * Obs.: Neste arquivo a forma de representação dos dados
     * é feita como "key=value".
     * @param key chave com o valor para ser pesquisado no properties
     * @return int com o valor contido no arquivo e convertido para integer
     */
    public static int getInt(String key) {
        try {
            return new Integer(getResource().getString(key)).intValue();
        } catch (Exception e) {
            System.err.print(e.getMessage());            
        	//SegurancaLog.registrarError(new PropriedadesMd() ,e.getMessage());
        }
        return 0;
    }

    /**
     * Obtém o valor de chave no arquivo properties no formato booleano. 
     * Obs.: Neste arquivo a forma de representação dos dados
     * é feita como "key=value".
     * @param key chave com o valor para ser pesquisado no properties
     * @return boolean com o valor contido no arquivo e convertido para boolean,
     *  "true" ou "false"
     */
    public boolean getBoolean(String key) {
        try {
            return new Boolean(getResource().getString(key)).booleanValue();
        } catch (Exception e) {
            System.err.print(e.getMessage());            
        	//SegurancaLog.registrarError(new PropriedadesMd() ,e.getMessage());
        }
        return false;
    }

}

ConstantesMd.java

public class ConstantesMd implements Serializable {
    
    // Aqui é a referencia para o arquivo
	// O meu no caso é o constantes.properties que está no pacote resources
	public static String ARQUIVO_PROPERTIES = "resources.constantes";
    
	// Aqui é a declaraçao
	// Perceba que PropriedadesMd.getInt("mensagem") mensagem é o nome do
	// que você deu no seu arquivo properties e Mensagem é o o nome o qual 
	// será identificado.
    public static int Mensagem = PropriedadesMd.getInt("mensagem");
    

}

A chamada dentro de um JSP, por exemplo fica da seguinte forma:

<div id="foot">
    <%=ConstantesMd.Mensagem%>
</div>

Espero ter ajudado.

Abraço

G

Legal o tutorial… mas me gerou outra dúvida. Seguindo o tutorial, eu fiz:

Properties properties = new Properties();

FileInputStream in = new FileInputStream("/Bundle.properties");

properties.load(in);

in.close();

Se eu tiver o arquivo Bundle.properties no hd, passando o caminho completo dele, tudo bem, consigo ler. Mas no meu caso, este arquivo está incluído no meu projeto web, ou seja, estará dentro do .war.
Como faço para pegar o caminho dele a partir da raiz do projeto?

Obrigado.

F

use o getClass().getResourceAsStream ("Bundle.properties");
Com ele vc obtem o arquivos que estao no classpath.
Tem exemplo aqui.

G

Properties properties = new Properties(); InputStream in = this.getClass().getResourceAsStream("Bundle.properties"); properties.load(in); in.close();

Deu certinho… valeu pessoal!!

Criado 12 de março de 2007
Ultima resposta 12 de mar. de 2007
Respostas 6
Participantes 4