import java.util.Scanner;
import java.io.IOException;
import java.io.EOFException;
import java.io.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Circulo implements Serializable
{
	private double x, y;
	private double raio;
	private final double pi = 3.1415;
	public Circulo(double x, double y, double raio)
	{
		this.x = x;
		this.y = y;
		this.raio = raio;
	}
	public Circulo(double r)
	{
		this(0, 0, r);
	}
	public double calculaArea()
	{
		return pi*raio*raio;
	}
	public double calculaPerimetro()
	{
		return 2 * pi * raio;
	}
	public String toString()
	{
		return "(" + x + ", " + y + "): r = " + raio;
	}
}

public class ArquivoBinario
{
	public void insereDados()
	{
		ObjectOutputStream out = null;
		try
		{
			out = new ObjectOutputStream ( new FileOutputStream ("circulo.dat") );
		}
		catch( IOException e )
		{
			System.out.println("Erro ao criar o arquivo!");
			System.exit(0);
		}

		double x, y, r;
		Scanner scan = new Scanner(System.in);

		do
		{
			System.out.println("Digite as informacoes do Circulo: x y raio (raio negativo para terminar)");
			x = scan.nextDouble();
			y = scan.nextDouble();
			r = scan.nextDouble();

			if ( r > 0 )
			{
				Circulo c = new Circulo(x, y, r);

				try
				{
					out.writeObject( c );
				}
				catch( IOException e )
				{
					System.out.println("Erro ao inserir informacoes no arquivo!");
					System.exit(0);
				}
			}

		}while(r > 0);

		try
		{
			out.close();
		}
		catch( IOException e )
		{
			System.out.println("Erro ao fechar o arquivo!");
			System.exit(0);
		}
	}

	public void recuperaDados()
	{
		ObjectInputStream in = null;
		try
		{
			in = new ObjectInputStream ( new FileInputStream ("circulo.dat") );
		}
		catch( IOException e )
		{
			System.out.println("Erro ao abrir o arquivo!");
			System.exit(0);
		}

		System.out.println("Dados dos circulos armazenados");
		try
		{
			while( true )
			{
				Circulo c = (Circulo) in.readObject();
				System.out.println(c);
			}
		}
		catch( EOFException e )
		{
			System.out.println("---");
		}
		catch( IOException e )
		{
			System.out.println("Erro durante a leitura do arquivo!");
			System.exit(0);
		}
		catch( ClassNotFoundException e )
		{
			System.out.println("Nao foi possivel ler o objeto do arquivo!");
			System.exit(0);
		}

		try
		{
			in.close();
		}
		catch( IOException e )
		{
			System.out.println("Erro ao fechar o arquivo!");
			System.exit(0);
		}
	}

	public static void main(String [] args)
	{
		int op;
		ArquivoBinario t = new ArquivoBinario();

		do
		{
			System.out.println("----- MENU -----");
			System.out.println("1) Inserir Circulos no arquivo");
			System.out.println("2) Recuperar Circulos do arquivo");
			System.out.println("3) Sair\n");
			op = new Scanner(System.in).nextInt();

			if ( op == 1 ) t.insereDados();
			else if ( op == 2 ) t.recuperaDados();
			else if ( op == 3 ) System.out.println("Finalizando aplicacao...");
			else System.out.println("Opcao invalida!");

		}while(op != 3 );
	}
}
