Leitura de dados de herança com FileInput

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?

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);
1 curtida

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

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

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

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.

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