Console e Serialização: Desmistificando a Certificação SCJP6 Parte X - Parte 5

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

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.

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.

4)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

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?