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:

  1. Declaramos que a classe Dog implementa a interface Serializable.
  2. Criamos um objeto Dog pertencente a uma classe serializável.
  3. Serializamos o objeto Dog invocando o método writeObject() de ObjectOutputStream.
  4. 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.

  5. Desserializamos o objeto Dog fazendo uma chamada ao método readObject().

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

Artigos relacionados