Dificuldade em ler arquivo properties[RESOLVIDO]

17 respostas
cardosao

Ola, a todos.

Estou tentando ler um arquivo .properties de uma pasta de meu projeto, exemplo br.com.projeto.strings

Estou usando o metodo “load” da Classe Properties, porem nao estou conseguindo enxergar o arquivo ao instanciar um objeto file
e com isso nao estou conseguindo ler ele.

Estou usando desta forma:

public String loadFile(String chave){
        File f = new File("br.com.projeto.strings.Language_pt_BR");
        InputStream is;
        try {
            if (f.exists()) {
                is = new FileInputStream(f);
                this.properties.load(is);
                this.valor = this.properties.getProperty(chave);
            }    
        } catch (IOException ex) {
            Logger.getLogger(LoadFileLanguage.class.getName()).log(Level.SEVERE, null, ex);
        }
        return this.valor;   
    }

ja tentei com e sem a extensao properties.

Mas nao consegui.

Obrigado.

17 Respostas

W

Acho que vc esta complicando muito, tenta fazer algo desse tipo:

Properties properties = new Properties();

try {
    properties.load(new FileInputStream("filename.properties"));
} catch (IOException e) {
  // bla bla bla
}

//Daniel

cardosao

Ola, bom dia.

Tentei como vc falou tbm, inclusive mudando o arquivo para a mesma pasta da classe q tenta fazer a leitura e retorna a mesma erro:

java.io.FileNotFoundException: Language_pt_BR.properties (No such file or directory)

Tentei tambem com :

ResourceBundle BUND = ResourceBundle.getBundle(" Language_pt_BR");

Porem retornou erro tambem, estou utilizando um arquivo properties dentro da pasta do projeto e nao na pasta do jar.

Gostaria de fazer uma classe que tivesse os valores de todas as labels, buttons e assim nao utilizar hardcoded.

Acho que o segredo deva estar na forma de passar o local do arquivo.

Agradeço sua resposta.

cardosao

enviei duas vezes o post acima sem querer.

W

cardosao:
Ola, bom dia.

Tentei como vc falou tbm, inclusive mudando o arquivo para a mesma pasta da classe q tenta fazer a leitura e retorna a mesma erro:

java.io.FileNotFoundException: Language_pt_BR.properties (No such file or directory)


Mas ai o problema eh outro, vc esta recebendo FileNoFoundException.

Tem certeza que vc estava usando o caminho para o arquivo corretamente???

Porque se vc faz assim:

properties.load(new FileInputStream("filename.properties"));

Vai procurar o arquivo no diretorio que vc esta rodando o seu programa.

//Daniel

rafaduka
acho que ajuda:
package br.com.properties

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class HandleProperties {
	
	private Properties props;
	private static final String FILE_NAME = "/META-INF/file.properties";

	/**
	 * Construtor padrão, para o path
	 * 
	 * "/META-INF/file.properties"
	 */
	public HandleProperties() {
		InputStream in = getClass().getResourceAsStream(FILE_NAME);
		try {
			loadProperties(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Construtor alternativo
	 * 
	 * @param fileName Caminho onde está o properties alternativo
	 */
	public HandleProperties(String fileName) {
		InputStream in = getClass().getResourceAsStream(
						fileName == null 
						? FILE_NAME
						: fileName);
		try {
			loadProperties(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	
	private void loadProperties(InputStream in) throws IOException {
		props = new Properties();
		props.load(in);
		in.close();
	}

	/**
	 * 
	 * @param chave chave para consulta.
	 * 
	 * @return Valor da correspondente chave
	 */
	public String getContent(String chave) {
		return props.getProperty(chave).trim();
	}
}
para usar:
HandleProperties hp = new HandleProperties("br.com.projeto.strings.Language_pt_BR.properties");
String nome = hp.getContent("name");
String idade = hp.getContent("idade");
jv.nicocelli

Bom dia…

cardosao…

Tenta informando o diretório da seguinte forma:

public String loadFile(String chave){  
    File f = new File("src/br/com/projeto/strings.Language_pt_BR");  
    InputStream is;  
    try {  
        if (f.exists()) {  
            is = new FileInputStream(f);  
            this.properties.load(is);  
            this.valor = this.properties.getProperty(chave);  
        }      
    } catch (IOException ex) {  
        Logger.getLogger(LoadFileLanguage.class.getName()).log(Level.SEVERE, null, ex);  
    }  
    return this.valor;     
}
cardosao

Bom dia a todos.

Consegui resolver.

Atraves das dicas de todos voces, montei um array de cada diretorio começando por “.” e fui descendo “./” , “./scr”

File f2 = new File("./src/br/com/projeto/strings");
        File files [] = f2.listFiles();
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            System.out.println("FILE2 "+file.getName());
        }

até que consegui achar os arquivos:

File f = new File("./src/br/com/projeto/strings/PT.properties");

Na verdade a gente qdo nao consegue resolver um problema acaba entrando em “loop”.

Agradeço a ajuda de todos: nicocelli, rafaduka e widsofhell.

Ps. Rafaduka seu codigo ficou bem bacana, irei testar e dou feedback.

Abraços.

E

Cheirinho de “programa que não vai funcionar quando você for gerar um jar e rodar fora do Eclipse ou Netbeans :(”

aechiara

acredito que depois vc vai querer ler de dentro de um JAR esse arquivo, certo ?

a mágica aí é fazer como disse o nosso amigo rafaduka, e utilizar o

getClass().getResourceAsStream(FILE_NAME);

onde o FILE_NAME seria o pacote junto com o nome do arquivo

nas IDEs (e mesmo com ANT ou Maven), quando vc faz o build, tudo que está no diretório src, vai parar no classes (ou equivalente para os binários), e provavelmente em um JAR/WAR/EAR … depende da sua aplicação, aí para lê-los vc deve usar o getResourceAsStream

cardosao

Testando e aviso se der certo.

Obrigado.

cardosao

Executei o codigo abaixo (uma cópia do rafaduka)

public class HandlerProperties {  
      
    private Properties props;  
  
  
    /** 
     * Construtor alternativo 
     *  
     * @param fileName Caminho onde está o properties alternativo 
     */  
    public HandlerProperties(String fileName) {  
        InputStream in = getClass().getResourceAsStream(fileName);  
        try {  
            loadProperties(in);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    private void loadProperties(InputStream in) throws IOException {  
        props = new Properties();  
        props.load(in);  
        in.close();  
    }  
  
    /** 
     *  
     * @param chave chave para consulta. 
     *  
     * @return Valor da correspondente chave 
     */  
    public String getContent(String chave) {  
        return props.getProperty(chave).trim();  
    } 
    
    public static void main(String[] args) {
        HandlerProperties hp = new HandlerProperties("br.com.projeto.strings.pt_BR.properties");  
        String nome = hp.getContent("botao");  
        System.out.println(nome);
    }
}

retornou :

Exception in thread "main" java.lang.NullPointerException
	at java.util.Properties$LineReader.readLine(Properties.java:418)
	at java.util.Properties.load0(Properties.java:337)
	at java.util.Properties.load(Properties.java:325)
	at br.com.printevo.service.load.HandlerProperties.loadProperties(HandlerProperties.java:36)
	at br.com.printevo.service.load.HandlerProperties.<init>(HandlerProperties.java:28)
	at br.com.printevo.service.load.HandlerProperties.main(HandlerProperties.java:51)
Java Result: 1

Deve ter alguma coisa que estou fazendo errado e não estou percebendo.

Agradeço a ajuda.

rafaduka

deve estar errado o caminho que vc está passsando.

cardosao

Galera tentei de todas as formas com pontos, porem só funciona com barras:

public class HandleProperties {  
      
    private Properties props;  
    public HandleProperties(String fileName) {  
        InputStream in = getClass().getResourceAsStream(fileName); 
        try {  
            loadProperties(in);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    private void loadProperties(InputStream in) throws IOException {  
        props = new Properties();  
        props.load(in);  
        in.close();  
    }  


    public String getContent(String chave) {  
        return props.getProperty(chave).trim();  
    } 
    
    public static void main(String[] args) {
        HandleProperties hp = new HandleProperties("/resources/pt_BR.properties");  
        String nome = hp.getContent("botao");  
        System.out.println(nome);
    }
}

até mudei a pasta para resources que fica mais facil, mas qdo eu coloco:

getClass().getResourceAsStream(fileName);

passando resources.pt_BR.properties retorna null

Exception in thread "main" java.lang.NullPointerException
	at java.util.Properties$LineReader.readLine(Properties.java:418)
	at java.util.Properties.load0(Properties.java:337)
	at java.util.Properties.load(Properties.java:325)

Abraço.

cardosao

Será que pode ser a versão do meu java ?

Estou usando a versão 1.6.0.30.

Ou do netbeans 7.0.1?

Obrigado.

rafaduka

mude no código e procure em todo o CLASSPATH

getClass().getClassLoader().getRessourceAsStream("com/teste1/arquivo.properties");
J

Tente fazer o seguinte:

  • Crie uma pasta dentro de src chamada resource;
  • Coloque o arquivo “arquivo.properties” dentro da pasta criada;
  • Criar uma propriedade chamada “nome”;

Desta forma funcionou não só executando pelo eclipse mas também executando com um .jar que foi gerado. O .jar está em anexo.

E utilize o código assim:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.swing.JOptionPane;

public class HandleProperties {

    private Properties props;
    private static final String FILE_NAME = "/META-INF/file.properties";

    /**
     * Construtor padrão, para o path
     * 
     * "/META-INF/file.properties"
     */
    public HandleProperties() {
        InputStream in = getClass().getResourceAsStream(FILE_NAME);
        try {
            loadProperties(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Construtor alternativo
     * 
     * @param fileName Caminho onde está o properties alternativo
     */
    public HandleProperties(String fileName) {
        InputStream in = getClass().getResourceAsStream(fileName == null ? FILE_NAME : fileName);
        try {
            loadProperties(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void loadProperties(InputStream in) throws IOException {
        props = new Properties();
        props.load(in);
        in.close();
    }

    /**
     * 
     * @param chave chave para consulta.
     * 
     * @return Valor da correspondente chave
     */
    public String getContent(String chave) {
        return props.getProperty(chave).trim();
    }

    public static void main(String[] args) {
        HandleProperties hp = new HandleProperties("/resource/arquivo.properties");
        String nome = hp.getContent("nome");
        JOptionPane.showMessageDialog(null, nome);
    }
}
cardosao

Resolvido, ja testado execuntado o jar.

public class HandleProperties {  
      
    private Properties props;
    private String valor;

    public HandleProperties(Idioma idioma) {  
        InputStream in = getClass().getClassLoader().getResourceAsStream("resource/"+idioma.getLanguage()+".properties"); 
        try {  
            loadProperties(in);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    private void loadProperties(InputStream in) throws IOException {  
        props = new Properties();  
        props.load(in);  
        in.close();  
    }  

    public String getContent(String chave) {  
        return props.getProperty(chave).trim();  
    } 
    
    public static void main(String[] args) {
        HandleProperties hp = new HandleProperties(Idioma.BRASIL);  
        String nome = hp.getContent("botao");  
        System.out.println(nome);
    }
}

Agradeço a todos.

Espero um dia poder ajudar tanto quanto fui ajudado.

Abraços.

Criado 26 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 17
Participantes 7