Java:Usando Objetos Serializados em Java

From Wiki

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.
Ao executarmos geramos os arquivos:
java Distribuidor

resultado: 
ls /tmp/Correios/00*/
/tmp/Correios/001/:
A000.obj  A001.obj  A002.obj  A003.obj  A004.obj  A005.obj  A006.obj  A007.obj  A008.obj  A009.obj  A010.obj
/tmp/Correios/002/:
A011.obj  A012.obj  A013.obj  A014.obj  A015.obj  A016.obj  A017.obj  A018.obj  A019.obj  A020.obj
...
/tmp/Correios/009/:
A081.obj  A082.obj  A083.obj  A084.obj  A085.obj  A086.obj  A087.obj  A088.obj  A089.obj  A090.obj
  • 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;
	}
}