Resgatar valor de um arquivo .properties

6 respostas
gustavodelgado

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.

furutani

Leia um otimo tutorial da SUN

fsquadro

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

gustavodelgado

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.

furutani

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

gustavodelgado

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