Java:Usando Objetos Serializados em Java
Ao serializar objetos em java, convertemos aquele "objeto/dado" em um conjunto de bytes que podem ser armazenados em um arquivo, para que posteriormente possamos utilizar os dados novamente como o objeto original.
Complexo!!! Mas vamos utilizar uma problema de negócio para explicar isso.
Resolvendo o Problema de negócio
Problema: Um Agência dos correios precisamos entregar 100 cartas rapidamente, sendo que a mesma tem 10 carteiros para executar o serviço?
Para resolvermos esse problema de distribuição criamos 3 classes;
- Carta = Objeto a ser serializado
- Distribuidor = Pega todas as cartas, classifica e distribui entre os carteiros.
- Ao classificarmos as cartas criamos o objeto Carta e serializo o mesmo para ser utilizado pelo Carteiro, armazenando o objeto no respectivo diretório do carteiro. Exemplo
- /tmp/Correios/001
- /tmp/Correios/002
- ...
- /tmp/Correios/010
- Ao classificarmos as cartas criamos o objeto Carta e serializo o mesmo para ser utilizado pelo Carteiro, armazenando o objeto no respectivo diretório do carteiro. Exemplo
- Carteiro = Pega as respectivas cartas, no seu diretório e faz a entrega.
- O Carteiro pega o arquivo com o objeto e cria novamente o objeto Carta. Fazemos um print do Objeto.
Neste exemplo estou utilizando 100 cartas, mas este valor poderia ser 10 Milhões de cartas. Para ter a performance que eu esperava da aplicação, executei diversas vezes a aplicação Carteiro. Exemplo:
java Carteiro 001 & java Carteiro 002 & ... java Carteiro 010 &
Classes
Distribuidor.java
package net.ebasso; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class Distribuidor { private static String outputCorreioDiretorio="/tmp/Correios"; private static int cartas = 100; public static void main(String[] args) { executaExemplo02(); } public static void executaExemplo02() { Distribuidor application = new Distribuidor(); try { String sufixo = ""; int j = 1; String carteiro = String.format("%03d", j); for (int i = 1; i < cartas; i++) { sufixo = String.format("%03d", i) ; ArrayList<String> destinatarios = new ArrayList<String>(); destinatarios.add("Ciclano da Silva " + sufixo); destinatarios.add("Beltrano de Oliveira " + sufixo); application.runOnce("A"+sufixo , carteiro,"Fulano de Tal " + sufixo, destinatarios, "Meus amigos .... Feliz Natal"); if ((i % 10) == 0) { j++; carteiro = String.format("%03d", j); } } } catch (Exception e) { e.printStackTrace(); } } public static void executaExemplo01() { Distribuidor application = new Distribuidor(); try { ArrayList<String> destinatarios = new ArrayList<String>(); destinatarios.add("Ciclano da Silva"); destinatarios.add("Beltrano de Oliveira"); application.runOnce("A000","001","Fulano de Tal", destinatarios, "Meus amigos .... Feliz Natal"); } catch (Exception e) { e.printStackTrace(); } } private void runOnce(String messageId, String cep, String remetente, ArrayList<String> destinatarios, String conteudo ) throws Exception { // Criando a carta e definindo os valores Carta carta = new Carta(); carta.setMessageId(messageId); carta.setCep(cep); carta.setRemetente(remetente); carta.setConteudo(conteudo); carta.setDestinatarios(destinatarios); // Armazenando o objeto serializado String ojbFilename = outputCorreioDiretorio + "/" + cep + "/" + messageId + ".obj"; FileOutputStream arquivoAGravar = new FileOutputStream(ojbFilename); ObjectOutputStream objetoAGravar = new ObjectOutputStream(arquivoAGravar); objetoAGravar.writeObject(carta); objetoAGravar.flush(); objetoAGravar.close(); arquivoAGravar.close(); } }
Carteiro.java
package net.ebasso; import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Iterator; public class Carteiro { private static String inputCorreioDiretorio="/tmp/Correios"; public static void main(String[] args) { Carteiro application = new Carteiro(); try { String carteiroCep="001";
if (args.length > 0) { String carteiroCep = args[0];
} File folder = new File(inputCorreioDiretorio + "/" + carteiroCep); File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { String arquivo = listOfFiles[i].getName(); application.runOnce(arquivo, carteiroCep); } } } catch (Exception e) { e.printStackTrace(); } } private void runOnce(String messageId, String cep) throws Exception { String inputFilename = inputCorreioDiretorio + "/" + cep + "/" + messageId; FileInputStream arquivoALer = new FileInputStream(inputFilename); ObjectInputStream objetoALer = new ObjectInputStream(arquivoALer); // Criando a carta e definindo os valores Carta carta = (Carta) objetoALer.readObject(); objetoALer.close(); arquivoALer.close(); System.out.println("Entrega Carta ..."); System.out.println(""); System.out.println("carta.getCep ..." + carta.getCep()); System.out.println("carta.getRemetente ..." + carta.getRemetente()); ArrayList<String> destinatarios = carta.getDestinatarios(); Iterator<String> iterator = destinatarios.iterator(); while (iterator.hasNext()) { String destinatario = (String) iterator.next(); System.out.println("Destinatario ..." + destinatario); } System.out.println(""); System.out.println("carta.getConteudo ..." + carta.getConteudo()); } }
Carta.java
package net.ebasso; import java.io.Serializable; import java.util.ArrayList; public class Carta implements Serializable{ private static final long serialVersionUID = 3818318077429278285L; private String messageId; private String cep; private String remetente; private ArrayList<String> destinatarios; private String conteudo; public String getMessageId() { return messageId; } public void setMessageId( String messageId) { this.messageId = messageId; } public String getCep() { return cep; } public void setCep( String cep) { this.cep = cep; } public String getRemetente() { return remetente; } public void setRemetente( String remetente) { this.remetente = remetente; } public String getConteudo() { return conteudo; } public void setConteudo( String conteudo) { this.conteudo = conteudo; } public ArrayList<String> getDestinatarios() { return destinatarios; } public void setDestinatarios( ArrayList<String> destinatarios) { this.destinatarios = destinatarios; } }