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