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!
publicclassArquivo{publicstaticvoidmain(String[]args){Stringvalor="david26666";Filefile=newFile("david.properties");Propertiesprop=newProperties();FileInputStreamin=null;file.canWrite();try{in=newFileInputStream(file);prop.load(in);prop.setProperty("name",valor);in.close();System.out.println("ok");}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(prop.getProperty("name"));}}
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
thingol
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
davidhc
então eu preciso criar um FileOutputStream e dar write para tudo que já existe no arquivo?
sim, mas eu não tinha visto que ele não estava alterando no próprio .properties :oops:
tem alguma idéia?
T
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.
D
davidhc
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
davidhc
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