Console e Serialização: Desmistificando a Certificação SCJP6 Parte X - Parte 5
Na próxima parte do artigo falaremos da classe Console e Serialização.
Console
A classe java.io.Console foi inserida no Java 6. Console quer dizer um dispositivo com um teclado e uma tela. Podemos compreender um console como um computador.
Uma referência desse objeto pode ser adquirida por meio do método estático System.console().
A classe Console ainda permite escrever saídas formatadas para a linha de comando.
Do ponto de vista da entrada de dados, é necessário entender o funcionamento dos métodos readLine() e readPassword(). O método readLine() retorna uma String contendo tudo o que o usuário digitou.
Porém, o método readPassword() não retorna uma String e sim um array de char. Esse é o motivo pelo qual, uma vez que se tenha obtido a senha, é possível verificá-la e retirá-la da memória. Se uma String fosse retornada, ela poderia existir em um pool pertencente a algum local na memória e ser encontrada.
package devmedia;
import java.io.Console;
class Utils{
String fazerAlgo(String arg1){
return "Valor de parametro: "+arg1;
}
}
public class TesteConsole {
static String nome;
/**
* @param args
*/
public static void main(String[] args) {
Console csl = System.console();
char[]pw;
pw = csl.readPassword("%s","pw: ");
for (char ch : pw) {
csl.format("%c", ch);
}
csl.format("\n");
Utils u = new Utils();
while(true){
nome = csl.readLine("%s","entrada?: ");
csl.format("saída: %s \n", u.fazerAlgo(nome));
}
}
}
Na implementação do método main(), chamamos System.console() no sentido de conseguirmos a referência do console. Essa referência é armazenada na variável cls.
Em seguida, declaramos um array de chars e o populamos com o retorno do método cls.readPassword(“%s”,”pw:”). É importantíssimo que, ao executar o programa, você note que a String pw é exibida e existe uma pausa para que se digite a senha.
Continuando, vamos ao método readLine(). Este método captura a entrada do usuário a partir do teclado e retorna uma String.
Serialização
A serialização incide em gravar um arquivo que possui objetos achatados (serializados). A seguir, faça com que seu programa leia os objetos serializados no arquivo e os converta outra vez em objetos ativos, existentes na memória heap.
O arquivo serializado será bem mais complexo para as pessoas lerem, entretanto será bem mais fácil, além de mais seguro, para o programa recuperar.
Em arquivo-texto, tente visualizar a quantidade de maneiras errôneas em que esse arquivo poderia ser lido. Um exemplo seria a leitura em ordem errada, provocando por conseguinte, a troca de atributos. A serialização proporciona facilmente que você salve um objeto e o seu estado.
ObjectInputStream e ObjectOutputStream
A magia da serialização básica ocorre com somente dois métodos: um para serializar objetos e escrevê-los em um stream e o outro para ler o stream e desserializar o objeto.
Iremos exemplificar isso com um programa que gera um objeto, o serializa e em seguida o deserializa.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Dog implements Serializable{}//1
public class SerializaDog {
/**
* @param args
*/
public static void main(String[] args) {
Dog c= new Dog();//2
try{
FileOutputStream fs = new FileOutputStream("teste1.txt");
ObjectOutputStream os= new ObjectOutputStream(fs);
os.writeObject(c);//3
os.close();
}catch (Exception e) {
}
try{
FileInputStream fis = new FileInputStream("teste1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
c = (Dog)ois.readObject();//4
ois.close();
}catch (Exception e) {
}
}
}
Observemos alguns pontos essenciais deste exemplo:
- Declaramos que a classe Dog implementa a interface Serializable.
- Criamos um objeto Dog pertencente a uma classe serializável.
- Serializamos o objeto Dog invocando o método writeObject() de ObjectOutputStream.
- Desserializamos o objeto Dog fazendo uma chamada ao método readObject().
Não se esqueça de que a chamada de writeObject() realiza 2 tarefas: serializa o objeto e escreve o objeto serializado em um arquivo.
Um modelo mais aprimorado é o da Classe Automovel. Uma vez serializado, o valor de um dos atributos é modificado; porém, o estado do objeto é retornado precisamente como estava antes da serialização.
package devmedia;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Automovel implements Serializable{
private String modelo = "CARRO";
private String marca = "FIAT";
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
@Override
public String toString() {
return marca+modelo;
}
}
public class SerializaAutomovel {
/**
* @param args
*/
public static void main(String[] args) {
Automovel c1 = new Automovel ();
System.out.println(c1);
try{
FileOutputStream f = new FileOutputStream("arquivo_aut.txt");
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(c1);
o.close();
c1.setMarca("Volks");//após a serialização, não adianta modificar
FileInputStream fi = new FileInputStream("arquivo_aut.txt");
ObjectInputStream oi = new ObjectInputStream(fi);
Automovel x = (Automovel)oi.readObject();
oi.close();
System.out.println(x);
}catch (Exception e) {
}
}
}
Por fim na última parte desta sequência aplicaremos um mini-teste.
Leia todos artigos da série
- Desmistificando a Certificação SCJP6 - Parte I
- Desmistificando a Certificação SCJP6 - Parte II
- Desmistificando a Certificação SCJP6 - Parte III
- Desmistificando a Certificação SCJP6 - Parte IV - Parte 1
- Desmistificando a Certificação SCJP6 - Parte IV - Parte 2
- Desmistificando a Certificação SCJP6 - Parte V - Parte 1/3
- Desmistificando a Certificação SCJP6 - Parte V - Parte 2/3
- Desmistificando a Certificação SCJP6 - Parte V - Parte 3/3
- Desmistificando a Certificação SCJP6 - Parte VI - Parte 1/3
- Desmistificando a Certificação SCJP6 - Parte VI - Parte 2/3
- Desmistificando a Certificação SCJP6 - Parte VI - Parte 3/3
- Desmistificando a Certificação SCJP6 - Parte VII - Parte 1/3
- Desmistificando a Certificação SCJP6 - Parte VII - Parte 2/3
- Desmistificando a Certificação SCJP6 - Parte VII - Parte 3/3
- Operadores apropriados - Desmistificando a Certificação SCJP6 - Parte VIII - Parte 1
- Instruções if e switch - Desmistificando a Certificação SCJP6 - Parte VIII - Parte 2
- Iteradores e loops - Desmistificando a Certificação SCJP6 - Parte VIII - Parte 3
- Mini-Teste: Desmistificando a Certificação SCJP6 - Parte VIII - Parte 4 - A
- Mini-Teste: Desmistificando a Certificação SCJP6 - Parte VIII - Parte 4 - B
- Tratamento de Exceções em Java: Desmistificando a Certificação SCJP6 - Parte IX - Parte 1
- Definindo Exceções em Java: Desmistificando a Certificação SCJP6 - Parte IX - Parte 2
- Assertivas Java: Desmistificando a Certificação SCJP6 - Parte IX - Parte 3
- Mini-Teste: Desmistificando a Certificação SCJP6 - Parte IX - Parte 4
- String: Desmistificando a Certificação SCJP6 - Parte X - Parte 1
- StringBuilder/StringBuffer e File: Desmistificando a Certificação SCJP6 - Parte X - Parte 2
- Combinação de Classes E/S: Desmistificando a Certificação SCJP6 - Parte X - Parte 3
- Utilizando Arquivos e Diretórios: Desmistificando a Certificação SCJP6 - Parte X - Parte 4
- Mini-teste: Desmistificando a Certificação SCJP6 - Parte X - Parte 6 A
- Mini-teste: Desmistificando a Certificação SCJP6 - Parte X - Parte 6 B
- Expressões Regulares: Desmistificando a Certificação SCJP6 Parte XI - Parte 1
- Lista Negada e Metacaracteres: Desmistificando a Certificação SCJP6 Parte XI - Parte 2
- Metacaracteres Âncora e Busca: Desmistificando a Certificação SCJP6 Parte XI - Parte 3
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Vídeo