Ajuda com api Properties

10 respostas
D

Opa :smiley:

Estou usando a api ‘Properties’ para alterar as configurações de um arquivo .properties, mas quando eu dou o setProperty, ele aparente escrever e em seguido eu rodo o getProperty e ele mostra o valor que eu setei no setProperty e quando eu abro o arquivo .properties, não tem nada alterado!

public class Arquivo {
	public static void main(String[] args) {
		String valor = "david26666";
		File file = new File("david.properties");
		Properties prop = new Properties();
		FileInputStream in = null;
		file.canWrite();
		try {
			in = new FileInputStream(file);
			prop.load(in);
			prop.setProperty("name", valor);
			in.close();
			System.out.println("ok");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(prop.getProperty("name"));
	}
}

10 Respostas

nbluis

Voçê tem que salvar o arquivo…

D

como que faço isso?

se eu usar FileOutputStream, não vai resolver meu problema pq terei que escrever todo arquivo novamente e eu só quero mudar uma propriedade!

T

Se quer usar um banco de dados, use um banco de dados.

Quando você usa “Properties”, que é um arquivo-texto, você tem de recuperar todas as propriedades e salvar todas as propriedades, mesmo que apenas uma propriedade seja modificada.
Isso é inerente a arquivos-texto.
O formato XML também tem esse problema.

D

então eu preciso criar um FileOutputStream e dar write para tudo que já existe no arquivo?

edit:

adicionei a linha

prop.store(new FileOutputStream("david.properties"), "");

Ele imprime de novo tudo, mas fica faltando os comentários e ele imprime fora de ordem…tem como imprimir sem mudar a ordem e sem tirar os comentários?

Kknd

Pra salvar vc tem que usar o método store(). No meu caso:

...
arquivo.storeToXML(new FileOutputStream(f), "Mapa do jMapEditor");
...
ViniGodoy

Engraçado, não foi você mesmo que colocou uma solução aqui?
http://www.guj.com.br/posts/list/52745.java#277553

D

ViniGodoy:
Engraçado, não foi você mesmo que colocou uma solução aqui?
http://www.guj.com.br/posts/list/52745.java#277553

sim, mas eu não tinha visto que ele não estava alterando no próprio .properties :oops:

tem alguma idéia?

T

Só para botar mais lenha na fogueira.

O problema de um arquivo “properties” é que os programadores acham que ele é exatamente um arquivo “.ini” - por exemplo, você poderia pôr comentários sem que eles se percam na atualização do arquivos, e a ordem das chaves não se alteraria.
O Windows tem uma API - WritePrivateProfileString - que dá a impressão de “escrever diretamente na linha”. Na verdade ele lê o arquivo inteirinho, grava a nova propriedade no lugar adequado, e grava o arquivo sobre o arquivo original.
Um arquivo Properties, em contrapartida:

  • Não preserva os comentários que você porventura tenha escrito;
  • O mecanismo para gravação e leitura é explícito, em vez de ser implícito como no Windows.
    Eu tive de criar uma subclasse de Properties que preservasse os comentários e a ordem das propriedades, para evitar esses problemas que a implementação padrão tem.
D

Kknd:
Pra salvar vc tem que usar o método store(). No meu caso:

... arquivo.storeToXML(new FileOutputStream(f), "Mapa do jMapEditor"); ...

save ou store vão dar no mesmo…save está deprecated…

D

thingol:
Só para botar mais lenha na fogueira.

O problema de um arquivo “properties” é que os programadores acham que ele é exatamente um arquivo “.ini” - por exemplo, você poderia pôr comentários sem que eles se percam na atualização do arquivos, e a ordem das chaves não se alteraria.
O Windows tem uma API - WritePrivateProfileString - que dá a impressão de “escrever diretamente na linha”. Na verdade ele lê o arquivo inteirinho, grava a nova propriedade no lugar adequado, e grava o arquivo sobre o arquivo original.
Um arquivo Properties, em contrapartida:

  • Não preserva os comentários que você porventura tenha escrito;
  • O mecanismo para gravação e leitura é explícito, em vez de ser implícito como no Windows.
    Eu tive de criar uma subclasse de Properties que preservasse os comentários e a ordem das propriedades, para evitar esses problemas que a implementação padrão tem.

Sempre com ótimas explicações thingol!
Vou voltar para a idéia inicial que era escrever o arquivo novamente! rs

Criado 21 de fevereiro de 2007
Ultima resposta 21 de fev. de 2007
Respostas 10
Participantes 5