A API Preferences?

Blz galera.

Estou dando uma olhada aqui no livro “Core Java 7 Edicao (Traduzido para PT-Br)” na parte de “A API Preferences”, parece q vai resolver meus problemas quanto ao uso de arquivos.properties pois com ela posso criar “preferencias” dentro dos meus pacotes e tbm consigo salvar e alterar essas preferencias tranquilamente.

Bem, mesmo lendo o livro e dando uma pesquisada nas docs, ainda não consegui entender bem como ela funciona, pelo que diz o livro ela se parece com o Registro do Windows porem bem mais poderosa pois consegue-se exportar e importar todas as preferencias de uma aplicação para outra, pelo menos é isso q entendi até agora.

O que ainda não entendi, é se essa API cria algum arquivo ou algo dentro dos pacotes pq isso não está bem explicado no livro, pelo menos não sei se realmente cria um arquivo ou algo do tipo e como ela mantem isso, se eh preciso exportar e depois qdo abrir a app importar, enfim, nao entendi.

estou fazendo assim.

public void readWritePreference(){		
		Preferences node = Preferences.userRoot().node("/preferences");//aqui o node seria meu pacote de preferencias
                //cria preferencias chaves/valores
                node.put("key1","valor1");
                node.put("key2","valor2");

                //le preferencias chaves
                System.out.println("key1: " + node.get("key1","value"));
                System.out.println("key2: " + node.get("key2","value"));
}

Em tempo de execução isso funciona blzinha, mas dentro do meu package “preferences” não há nenhum arquivo. Então gostaria de saber como realmente funciona essa API Preferences.

obrigado.

No Windows ela cria chaves no registro em “HKEY_CURRENT_USER\Software\JavaSoft\Prefs\nomeDoNode”.

No Linux ela salva as preferências de usuário em “/home/usuario/.java/.userPrefs/nomeDoNode” e as de sistema em “/etc/.java/.systemPrefs/nomeDoNode”.

http://java.sun.com/developer/technicalArticles/releases/preferences/

[quote=Eric Yuzo]No Windows ela cria chaves no registro em “HKEY_CURRENT_USER\Software\JavaSoft\Prefs\nomeDoNode”.

No Linux ela salva as preferências de usuário em “/home/usuario/.java/.userPrefs/nomeDoNode” e as de sistema em “/etc/.java/.systemPrefs/nomeDoNode”.

http://java.sun.com/developer/technicalArticles/releases/preferences/[/quote]

Opa Eric.

Obrigado, 100% funcional. No livro não diz onde são guardadas essas preferencias, affs !

vlw e obrigado.

Essa api parou de funcionar no win7 com o java 6, acabei portando o código para usar arquivos ini.

Eu testei em Win7+Java6, Win2008+Java7 e WinVista+Java6 e não tive problemas…Parou de funcionar vc quis dizer depreciada ? Pq se for isso, tbm em minhas pesquisas não encontrei nada sobre ela depreciada ou algo assim, até msm pq o NetBeans7 ou outras versões do NetBeans quando um metodo/classe/interface ou qquer coisa do tipo esteja depreciada, ele risca em cima e a preferences não aconteceu isso.
Defina melhor os critérios para vc dizer “parou de funcionar” ?

obrigado.

O que?

Muito legal isto, ainda não tinha visto. Ao fazer um teste aqui, gastei menos de 5 minutos. Funciona no win7.

Mas agora ficou uma dúvida:

Em aplicativos WEB (foi o teste que eu fiz usando o métod systemRoot - usei Eclipse), onde será gravado as definições? No meu computador, ou no servidor?
Se grava no servidor, daí beleza…
Se grava no client, quais as implicações?

(…ADEUS PROPERTIES…)

Obrigado a quem souber me responder.

Ok, depois de alguns testes aí vai:
Em projetos web a gravação é realizada no SERVIDOR, exatamente como postou o Eric Yuzo. É totalmente seguro, pois supondo que alguém apague esses registros no servidor, ao executar a aplicação novamente ela grava os valores default (talvez esse seja o único inconveniente, mas não prejudicará em nada o funcionamento).

A melhor forma de utilizar a API (acredito), seja assim:

Inicialmente crie um value object:

[code]public class Config {
private String value1;

public String getValue1() {
	return value1;
}
public void setValue1(String value1) {
	this.value1 = value1;
}	

}[/code]
Crie uma classe manager para configurar as preferencias:

[code]public class PreferencesManager {

//Declara o node (local onde guardar as preferencias)
private static final String PREFERENCES_NODE = "br/eti/prefs";

//GET
public static Pref getPreferencias() {
	//Pega a preferencia, se ela nao existir, grava o valor default "teste"
	Config config = new Config();
	config.setValue1(Preferences.systemRoot().node(PREFERENCES_NODE).get("value1", "teste"));
	return config;
}

//SET
public static void setPreferencias(Config config) {
	Preferences.systemRoot().node(PREFERENCES_NODE).put("value1", pref.getValue1());
}

}[/code]
No seu bean, faça assim:

[code]@ManagedBean(name=“appBean”)
@RequestScoped
public class AppBean {

PreferencesManager preferences = new PreferencesManager();
private Config config;

@PostConstruct
public void init(){
	config = PreferencesManager.getPreferencias();
}

public void salvar(){
	PreferencesManager.setPreferencias(config);
}

public Cinfig getConfig() {
	return config;
}

public void setConfig(Config config) {		
	this.config = config;
}

}[/code]
E na sua xhtml (aqui é somente para você testar, modificando os valores e salvando):

<h:form> <h:inputText value="#{appBean.config.value1}"/> <h:commandButton value="enviar" action="#{appBean.salvar}"/> </h:form>
Espero ter ajudado em alguma coisa os amigos do forum.

Olá! Boa noite a todos.
Gostaria de saber se tem algum modo de salvar usando outros tipos de registro, tipo reg_binary. Fiz uns testes e ele sempre salva o texto normal. Preciso salvar uma senha. Se alguém souber responder eu agradeço.

Veja aqui: http://stackoverflow.com/questions/6551224/how-to-set-a-binary-registry-value-reg-binary-with-powershell

Mas voce ainda pode, primeiramente, criptografar os dados e depois salva-los no registro. Para recuperar os dados é só descriptografar. Eu faço sempre isto usando os elementos abaixo:

java.security.spec.KeySpec; javax.crypto.Cipher; javax.crypto.SecretKey; javax.crypto.SecretKeyFactory; javax.crypto.spec.PBEKeySpec; javax.crypto.spec.PBEParameterSpec;

abcs.

obrigada pela resposta :slight_smile: vou dar uma olhada nisso.