Dificuldade em gravar num ficheiro de dados

Boas

Tenho um projeto que estou a desenvolver em java e tenho uma duvida no registo de utilizadores, acontece o seguinte tenho 3 utilizadores (docente, funcionario e aluno), tenho que fazer o resgisto destes 3 utilizadores com o username, password e tipo de utilizador (docente, funcionario e aluno) mas acontece que eu não estou a conseguir gravar para ficheiro n sei o que estou a fazer mal e gostaria que alguem me ajudasse, a lista fica sempre vazia e não grava, ja tentei de diversas formas e não sei mais o que fazer, peço desculpa mas eu não percebo mto de programação e tenho que fazer este projeto para terminar o curso, se me poderem dizer o que tenho mal e me mostrarem o que deveria mudar e meter bem agradecia, ja tentei de diversas formas e não esta a dar.

[code]//classe Escola com o main

import java.io.;import java.util.;

public class Escola
{
public static void main(String[] args) throws IOException, FileNotFoundException, ClassNotFoundException {

//criação de objecto
    
Ficheiro f = new Ficheiro();
Menu m = new Menu();
            
f.LeUtilizadores();
                   
//entrada no menu
    m.menuInicio();     

}
}
[/code]

[code]//Classe GereEscola onde esta o metodo registo de utilizadores

import java.io.;
import java.util.
;

public class GereEscola
{
List lista = new ArrayList();

// verifica se existe utilizador
public boolean existeLista(String user) {
for (Utilizadores utilizador : lista) {
if (utilizador.getUser().equals(user)) {
return true;
}
}
return false;
}

// registo de utilizadores
public void registo() throws IOException
{
// List lista = new ArrayList();
String user, pass;
int tipo,x;

   System.out.println("************* REGISTO **************");
   System.out.println("USERNAME: ");
   user= Leitura.LeString();
   System.out.println("PASSWORD: ");
   pass= Leitura.LeString();
   
   System.out.println("************* QUAL O TIPO DE UIILIZADOR **************");
   System.out.println("*********  Escolha uma das seguintes opções  *********");
   System.out.println("*********           1 - Docente              *********");
   System.out.println("*********           2 - Aluno                *********");
   System.out.println("*********           3 - Funcionario          *********");
   System.out.println("*********           4 - Voltar               *********");
   System.out.println("*                                                    *");
   System.out.println("******************************************************");
   x=Leitura.LeInt();
   switch (x) {
   case 1: 
        //tentei desta forma
        if(user!= null && !user.isEmpty() && !existeLista(user)){
            lista.add(new Utilizadores(user,pass,1));
            Ficheiro f = new Ficheiro();
            f.GravaUtilizadoresFicheiro(lista);
            System.out.println("Docente registado");
        }else{
            System.out.println("O utilizador com o username "+user+" já existe");
        }
        break;
   case 2:
        //e desta forma
        lista.add(new Utilizadores(user,pass,2));
        for(Utilizadores utilizador : lista)
            if(utilizador.getUser() == null ) {
                Ficheiro f = new Ficheiro();
                f.GravaUtilizadoresFicheiro(lista);
                System.out.println("Docente registado");
            }else{
                System.out.println("O utilizador com o username "+user+" já existe");
        }
        break;
  }

}[/code]

[code]//classe Ficheiro

import java.io.;import java.util.;

public class Ficheiro
{
// utilizadores
public void GravaUtilizadoresFicheiro(List lista) throws IOException{

    File file = new File("users.dat");
    
    try {
       
        if (!file.exists()) {
            //cria um ficheiro (vazio)
            file.createNewFile();
        }


        FileOutputStream os = new FileOutputStream(new File("users.dat"));
        ObjectOutputStream oos = new ObjectOutputStream(os);
    
        oos.writeObject(lista);
        oos.flush(); 
        oos.close();
        
   } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

public void LeUtilizadores() throws FileNotFoundException, IOException, ClassNotFoundException{


    ArrayList <Utilizadores> lista = new ArrayList <Utilizadores>();
    Utilizadores temp;
    try {
        ObjectInputStream in = new ObjectInputStream( new FileInputStream ("users.dat"));
        while ((temp=(Utilizadores)in.readObject()) !=null){
            lista.add(temp);
        }
        in.close();
    }
    catch(FileNotFoundException ex1) {
        System.out.println(ex1.getMessage());
    }
    
    catch(EOFException ex2) {
        System.out.println("End Of File");
    }


    catch(IOException ex3) {
        System.out.println(ex3.getMessage());
    }
    
    catch(ClassNotFoundException ex4) {
        System.out.println(ex4.getMessage());
    }
    System.out.println("*** Lista de Utilizadores ***");
    for(Utilizadores users : lista)
        System.out.println(users.getUser()+", "+users.getPass()+", "+users.getTipo());
}

} [/code]

[code]//classe Leitura para ler os dados do teclado

import java.io.*;

public class Leitura
{
public static String LeString()
{
String str = “”;
boolean ok = false;

    InputStreamReader stdin = new InputStreamReader(System.in); 
    BufferedReader linhastr = new BufferedReader(stdin); 


    while (!ok){
    try{
        str = linhastr.readLine();
        ok=true;
    }catch(IOException eio){
        System.out.println("Dado invalido volte a introduzir por favor:");
    }catch(Exception e){
        System.out.println("Dado invalido volte a introduzir por favor:");
    }
}         
    return str;
}


public static int LeInt() 
{ 
    int i=0;
    String str = ""; 
    boolean ok = false;


    InputStreamReader stdin = new InputStreamReader(System.in); 
    BufferedReader linhastr = new BufferedReader(stdin); 
    
    while (!ok){
    try{
        str = linhastr.readLine();
        i = Integer.parseInt(str);
        ok=true;
    }catch(IOException eio){
        System.out.println("Dado invalido volte a introduzir por favor:");
    }catch(Exception e){
        System.out.println("Dado invalido volte a introduzir por favor:");
    }
    }
    return i;
}

} [/code]

[code]//Classe utilizadores

import java.io.;import java.util.;

public class Utilizadores
{
private String user, pass;
private int tipo;

public Utilizadores() 
{
    user="";
    pass="";
    tipo=0;
}


public Utilizadores(String user, String pass, int tipo) 
{
    this.user=user;
    this.pass=pass;
    this.tipo=tipo;
}

public void setUser(String user) { this.user = user; }
public void setPassword(String pass) { this.pass = pass; }

public String getUser() { return user;}
public String getPass() { return pass;}

public int getTipo() { return tipo; }


public boolean equals(String user, String pass) {
    if (user.equals(this.user) && pass.equals(this.pass))
        return true;


    return false;
}

}[/code]

[code]//classe aluno

import java.io.;
import java.util.
;

public class Aluno extends Utilizadores implements Serializable
{
private String nome;
private int numero;
private int BI;
private int NIF;
private String data_nasc;

/**
 * Constructor for objects of class Funcionario
 */
public Aluno()
{
    super();
    nome="";
    numero=0;
    BI=0;
    NIF=0;
    data_nasc="";
}

public Aluno(String nome, int numero, String data_nasc, int BI, int NIF, String user, String pass, int tipo)
{
    super(user,pass,tipo);
    this.nome=nome;
    this.numero=numero;
    this.BI=BI;
    this.NIF=NIF;
    this.data_nasc=data_nasc;
}


// setters
public void setNome() { this.nome=nome;}
public void setNumero() { this.numero=numero;}
public void setBi(int BI) { this.BI=BI;}
public void setNif(int NIF) { this.NIF=NIF;}
public void setData_Nasc(String data_nasc) { this.data_nasc=data_nasc;}


// getters
public String getNome() { return nome;}
public int getNumero() { return numero;}
public int getBi() { return BI;} 
public int getNif() { return NIF;}
public String getData_Nasc() { return data_nasc;}

public void mostra_aluno()
{
    System.out.println("*************ALUNO**************");
    System.out.println("NOME:"+nome);
    System.out.println("IDADE:"+data_nasc);
    System.out.println("NIF:"+NIF);
    System.out.println("BI:"+BI);
}

}[/code]

[code]// funcionario

import java.io.;
import java.util.
;

public class Funcionario extends Utilizadores
{
private String nome, data_nasc;
private int NIF, BI;

/**
 * Constructor for objects of class Funcionario
 */
public Funcionario()
{
    super();
    nome="";
    data_nasc="";
    NIF=0;
    BI=0;
}

public Funcionario(String nome, String data_nasc, int BI, int NIF, String user, String pass, int tipo)
{
    super(user,pass,tipo);
    this.nome=nome;
    this.data_nasc=data_nasc;
    this.NIF=NIF;
    this.BI=BI;
}


// setters
public void setNome(String nome) { this.nome=nome;}
public void setData_Nasc(String data_nasc) { this.data_nasc=data_nasc;}
public void setNIF(int NIF) { this.NIF=NIF;}
public void setBI(int BI) { this.BI=BI;}

// getters
public String getNome() { return nome;}
public String getData_Nasc() { return data_nasc;}
public int getNIF() { return NIF;}
public int getBI() { return BI;}

public void mostra_funcionario()
{
    System.out.println("*************Funcionarios**************");
    System.out.println("Nome:"+nome);
    System.out.println("Idade:"+data_nasc);
    System.out.println("NIF:"+NIF);
    System.out.println("BI:"+BI);
}  

}
[/code]

[code]//Docente
import java.io.;
import java.util.
;

public class Docente extends Utilizadores
{
private String nome;
private String data_nasc;
private String disciplina;
private int BI;
private int NIF;

/**
 * Constructor for objects of class Funcionario
 */
public Docente()
{
    super();
    nome="";
    data_nasc="";
    BI=0;
    NIF=0;
}

public Docente( String nome, String disciplina, String data_nasc, int BI, int NIF, String user, String pass, int tipo)
{
    super(user,pass,tipo);
    this.nome=nome;
    this.BI=BI;
    this.NIF=NIF;
    this.data_nasc=data_nasc;
    this.disciplina=disciplina;
}
// setters
public void setBi(int BI) { this.BI=BI;}
public void setNif(int NIF) { this.NIF=NIF;}
public void setNome(String nome) {this.nome=nome;}
public void setData_Nasc(String data_nasc) { this.data_nasc=data_nasc;}
public void setDisciplina(String disciplina) { this.disciplina=disciplina;}


// getters
public String getNome() { return nome;}
public int getBi() { return BI;} 
public int getNif() { return NIF;}
public String getData_Nasc() { return data_nasc;}
public String getdisciplina() { return disciplina;}

public void mostra_docente()
{
    System.out.println("*************DOCENTE**************");
    System.out.println("NOME:"+nome);
    System.out.println("IDADE:"+data_nasc);
    System.out.println("NIF:"+NIF);
    System.out.println("BI:"+BI);
}  

}[/code]

[code]//classe menu

import java.io.;
import java.util.
;
import java.text.ParseException;

public class Menu
{
private int x;
private GereEscola gere = new GereEscola();

public void menuInicio() throws IOException
{
   // GereEscola gere = new GereEscola();
    
    System.out.println("*************SISTEMA DE GESTAO ESCOLAR************");
    System.out.println("*********Escolha uma das seguintes opções*********");
    System.out.println("*********   1 - LOGIN                    *********");
    System.out.println("*********   2 - REGISTO                  *********");
    System.out.println("*********   3 - SAIR                     *********");
    System.out.println("*                                                *");
    System.out.println("**************************************************");
    x=Leitura.LeInt();
    switch (x) {
    /**case 1:
        gere.login(listaUsers);
        break;*/
    case 2:
        gere.registo();
        break;
    case 3:
        System.exit(0);
        break;
        default:
        System.out.println("Esta opcao nao valida!!!");
    }
}

}[/code]

Agradeco toda a ajuda que me possam facultar

cumps

Dicas ao usar um ObjectInput/OutputStream:

a) Quando você grava um List, o objeto recuperado será um List, e você não precisa ficar remontando os pedaços da lista:

List<String> nomes = new ArrayList<String>();
nomes.add ("Joaquina");
nomes.add ("Patrícia");
nomes.add ("Maria");
ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream ("teste.bin"));
oos.writeObject (nomes);
oos.close();
...
ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("teste.bin"));
List<String> nomes = (List<String>) ois.readObject ();
ois.close();

b) Cuidado com o uso de ObjectInput/OutputStream. Como você viu, é complicado ir adicionando coisas a ele. Se puder, grave apenas um objeto gigante nele (que contenha todos os objetos que você precisa), e depois o feche. Não acrescente mais nada a ele. Ao abrir o arquivo para ler os dados, leia esse objeto gigante e o feche.