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