Leitura de dados de herança com FileInput

5 respostas
M

Pessoal, estou com uma dúvida com o FileInput, consigo gravar os dados em um .txt tranquilamente e até lê-los. O problema é quando tento usar a herança, não consigo ler um arquivo que foi gravado na txt.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Pessoa {
	private String nome;

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getNome() {
		return(nome);
	}
}

class PessoaFisica extends Pessoa {
	private String rg;
	
	public void setRg(String rg) {
		this.rg = rg;
	}
	
	public String getRg() {
		return(rg);
	}
}

class PessoaJuridica extends Pessoa {
	private String cnpj;
		
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}
		
	public String getCnpj() {
		return(cnpj);
	}
	
}

class Funcionario extends PessoaFisica {
	private String cartao;
	
	public void setCartao(String cartao) {
		this.cartao = cartao;
	}
	
	public String getCartao() {
		return(cartao);
	}
}

meu problema está exatamente aqui:

class UsaFunc {
	public static void main (String args[]) {
		Funcionario funcionario = new Funcionario();
		funcionario.setNome("Mateus");
		funcionario.setRg("50.022.304-X");
		funcionario.setCartao("000");
		
		try {
			FileOutputStream f = new FileOutputStream("funcionario.txt");
			ObjectOutputStream s = new ObjectOutputStream(f);
			s.writeObject(funcionario.getNome());
			s.flush();
			System.out.println("Correto");
		} 
		
		catch (Exception erro) {
			System.out.println(erro);
		}
		
		try {
			
			FileInputStream f = new FileInputStream("funcionario.txt");
			ObjectInputStream s = new ObjectInputStream(f);
			Funcionario x = (Funcionario)s.readObject();
			System.out.println(x);
			
			
			} catch (Exception erro) {
				System.out.println(erro);
			}
			
		}
	}

O que coloco no lugar do x para que ele leia o arquivo? E caso tenha mais que uma informação no txt, o rg, é possível pedir que leia apenas um deles?

5 Respostas

staroski

Você está salvando assim:

// Está gravando uma String
s.writeObject(funcionario.getNome());

E tentando carregar assim:

// Se gravou uma String, como vai ler um Funcionario?
Funcionario x = (Funcionario) s.readObject();

Tem que gravar assim:

s.writeObject(funcionario);
M

Ah sim, entendi oq disse. Tentei carregar assim e deu certo:

String x = (String)s.readObject();

staroski

Pôxa, writeObject e readObject deveriam ser usados para gravar e ler objetos complexos, não cadeias de caracteres.

M

Então, sou iniciante em java, vi em um livro que era assim que se grava dados mas ele não entra muito no assunto, apenas diz que é assim, por isso estou meio confuso.

Já vi alguma coisa sobre o BufferedWriter mas nada muito aprofundado também, nem sei a diferença entre eles.

staroski

Leia a documentação das classes, ajuda bastante.
https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html
:slight_smile:

Criado 8 de maio de 2018
Ultima resposta 10 de mai. de 2018
Respostas 5
Participantes 2