Registo e gravar para ficheiro

Boas

Eu tenho uma pequena duvida se me podessem ajudar agradecia, é o seguinte tenho 3 utilizadores, 3 classes: Docente, aluno e funcionario e uma outra classe com o nome de utilizadores que apenas tem o tipo o user e a pass, eu quero fazer um metodo numa classe diferente que implemente o registo do utilizador em que vai ser pedido o username, a pass e o tipo de utilizador e queria gravar para um ficheiro essa informação que depois quando chama-se o login ele devolvesse o user (uma dos 3 utilizadores) com a sua password e depois o menu era consoante o utilizador, o que fiz ate agora foi estas classes:

[code]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]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]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]public class Utilizadores
{
private String user, pass;
private int tipo;
private Aluno al;
private Docente doc;
private Funcionario func;

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() { this.user=user;}
public void setPass() { this.pass=pass;}

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

public int gettipo() {
return tipo;
}
}[/code]

[code]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]public void registo() throws IOException
{
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) {

[/code]

Isto foi o que fiz mas nesta ultima parte não sei como fazer e na classe utilizadores no metodo getTipo não sei se está bem, ou seja n sei como grava para um ficheiro com o user pass tipo e validar se o user ja existe, se me poderem ajudar agradecia

Obrigado e cumprimentos

Boas

Use File, FileWriter, BufferedWriter e BufferedReader. Não posso te dar mais detalhes agora, mas vá atrás que tenho certeza que conseguirá

Parece que o código da sua classe Registo (acho que você esqueceu um “r” aí no meio rs) está incompleto. Ele parou no switch e não tem mais nada. Além do fato de eu particularmente ter sentido falta do método main que, suponho, deveria estar nessa classe também, certo?

Além disso, só para esclarecer, você quer salvar o usuário e senha num arquivo no seu computador, é isso? Num arquivo texto, por exemplo?

O main não está ai mas se quiser eu coloco, o programa parou no switch porque não sei o que fazer de seguida ou seja caso 1 ele vai gravar com o user com a pass e com o tipo que neste caso sendo o 1 seria o docente. O que eu quero eh que ele grave a informação para um ficheiro por exemplo de texto com estes dados para depois quando fazer o login chamar o menu do utilizador correspondente.

Obrigado

Ah blz. Então, você já tem uma noção da parte de I/O do Java, mas você poderia ter utilizado algo melhor do que isso. Existe a interface Scanner que possui métodos muito bons para controlar sua entrada de dados. O mesmo existe para saída.

Não vou colocar aqui um código para sua solução, porque você pode querer trabalhar de várias formas diferentes. O que eu posso fazer é te dizer onde você pode aprender a fazer isso que você quer de maneira muito simples.

Se você quiser trabalhar com arquivos texto, a classe PrintStream ou FileWriter é excelente. Entenda todo o conceito de I/O de java aqui:
http://www.caelum.com.br/apostila-java-orientacao-objetos/pacote-java-io/

Outra boa solução para você seria trabalhar com XML. Como você está separando bem as suas classes, você poderia querer armazernar as suas informações no formato dos seus objetos. Assim, quando você recuperar, ele crie uma instância daquele objeto para você:
http://www.caelum.com.br/apostila-java-testes-xml-design-patterns/trabalhando-com-xml/

Eu aprendi a mexer com arquivos lendo esse tutorial daqui do guj mesmo. Veja se resolve o seu problema. http://www.guj.com.br/articles/13

Obrigado pela ajuda, vou ler esses links e ver s m ajudam a resolver esta duvida

Boas

Já tive a tentar gravar e não estou a conseguir isto foi o que eu fiz, o programa não da erro ao compilar, quando gravo o utilizador o sistema diz sempre que o utilizador ja existe. alguem me pode ajudar? Eu pretendo que no ficheiro users.dat conste o user username que clt optou a pass password que o clt escolheu e o tipo (docente/funcionario/aluno) e que valide se o user do novo utilizador ja exista no sitema.
Eu penso que na classe GereEscola no metodo registo alguma coisa não esteja bem.

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]import java.io.;
import java.util.
;

public class GereEscola
{
// registo de utilizadores
public void registo() throws IOException
{
ArrayList 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: 
        lista.add(new Utilizadores(user,pass,1));
        for(Utilizadores util : lista)
            if(util.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");
            }
    }

}[/code]

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();
            break;*/
        case 2:
            gere.registo();
            break;
        case 3:
            System.exit(0);
            break;
            default:
            System.out.println("Esta opcao nao valida!!!");
        }
    }
}
import java.io.*;
import java.util.*;


public class Ficheiro 
{
    // utilizadores
   public void GravaUtilizadoresFicheiro(ArrayList <Utilizadores> lista) throws IOException{
        
        lista = new ArrayList <Utilizadores>();
        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());
    }
}

Obrigado

Em Portugal escreve-se “registo”, “utilizador” e “ecrã” em vez de “registro”, “usuário” e “tela”. Não é um “r” esquecido"…

De qualquer maneira, em espanhol temos a “salchicha” em vez de “salsicha”. http://es.wikipedia.org/wiki/Salchicha

:oops: Peço perdão. Só agora com esse post dele que eu percebi ser o português de Portugal. Estou debugando o código aqui para ver qual é o problema.

OK. Acho que achei o problema. Veja a linha 32 da classe GereEscola:

public class GereEscola {
    // registo de utilizadores
    public void registo() throws IOException {
        ArrayList<Utilizadores> lista = new ArrayList<Utilizadores>();
        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:
            lista.add(new Utilizadores(user, pass, 1));
            for (Utilizadores util : lista)
                if (util.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");
                }
        }
    }
}

Você cria um novo objeto do tipo Utilizadores, passando o usuário, senha e tipo e adiciona à lista. Logo em seguida você itera nessa mesma lista e o if dentro dela verifica se existem registros com aquele usuário que você acabou de adicionar!!! Por isso não funciona.

O certo é você não adicionar à lista antes e deixar que o método gravaUtilizadoresFicheiro o faça. Você só tem que verificar se a lista possui registros antes de percorrê-la, se não você nunca irá adicionar o primeiro usuário.

OBS1: Dê preferência por utilizar interface ao invés da classe concreta, ou seja, ao invés de fazer

ArrayList<Utilizadores> lista = new ArrayList<Utilizadores>();

Faça

List<Utilizadores> lista = new ArrayList<Utilizadores>();

OBS2: Por convenção, os métodos devem começar com letra minúscula.

Peço desculpa mas continuo sem perceber, como vou fazer com que o GravaUtilizadoresFicheiro adicione a lista o utilizador que acabei de criar, estou a ver que o problema esta nesta parte:

case 1: 
            lista.add(new Utilizadores(user,pass,1));
            for(Utilizadores util : lista)
                if(util.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");
                }
        }

Peço desculpa mais uma vez, mas eu não sou lá mto bom a programação e tudo o que faço e com pesquisa e exemplos que acabo por compreender e implementar.

Bom, para ajudar no seus estudos, tem a apostila da Caelum que é bastante didática, fácil de seguir e diz o que tem de mais importante para você saber:

Mas voltando ao seu problema. No seu método gravaUtilizadores que fica na classe Ficheiro, ao invés de passar a lista, tente passar o objeto Utilizador que você criou. Você pode deixar a lista na classe Ficheiro.

boas

Mas como posso meter isso na classe ficheiro porque se o que é um novo utilizador com um user uma pass e o tipo que pode ser 1 ou 2 ou 3 dai estar a utilizar o case porque se for 1 é docente se for 2 ja é alunom por isso estou a fazer na classe GereEscola e adicionar a lista o novo utilizador…

Desculpa, sou um pouco nabo a programação e estou a ver que não vou conseguir fazer isto