Java - Crear un archivo con ayuda de un jtextfield

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Crear un archivo con ayuda de un jtextfield

Publicado por daniel (5 intervenciones) el 13/11/2018 03:46:41
Hola amigos programadores tengo un pequeño problema al querer escribir un archivo.

Estoy implementando una ventana de registro de usuarios en java, lo que pide es lo siguiente:
-usuario
-contraseña
-tipo de empleado

El punto esta en que quiero que esos datos se almacenen en archivo de texto, para que la proxima vez que el usuario quiera iniciar sesion se validen los datos en otra ventana.
Y ahi esta el problema, el archivo se crea, pero nunca escribe los datos que el usuario ingresa.

Espero puedan ayudarme con este gran problema, de antemano muchas gracias compañeros.

//Este es el action performed del boton 'registro'

1
2
3
4
5
6
7
8
9
10
11
private void jregistroActionPerformed(java.awt.event.ActionEvent evt) {
       if(jPassword.getText()!=jPRepeat.getText()){
           opc=1;
           acciones();
           this.hide();
           SEmpleado obj = new SEmpleado();
           obj.setVisible(true);
       }else{
           JOptionPane.showMessageDialog(null, "Las contraseñas no coinciden, intentelo de nuevo");
       }
    }


//Este metodo crea un array de tipo 'login' que es donde se almacenan las variables que quiero escribir en el archivo.

1
2
3
4
5
6
7
8
9
10
11
12
public void acciones(){
        Login [ ] arA = null;
        switch(opc){
            case 1:
                inserta(arrA, leerDatos());
            break;
            //case 2:
              //  carga("usuarios.txt");
                //System.out.println(consultaCDMX());
           // break;
        }
    }

//Este metodo lee los datos de cada textfield, y los almacena en Login()
1
2
3
4
5
6
7
8
public Login leerDatos(){
        Login obj = null;
        String user = jTUser.getText();
        String password = jPassword.getText();
        String nAcceso = jCpuesto.getToolTipText();
        obj = new Login(user,password,nAcceso);
        return obj;
    }

// Este metodo 'Crea' el archivo y almacena los datos de las variables ahi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Login[] inserta(Login[ ] arrA, Login obj) {
        Login[] tmp;
        try {
            tmp = new Login[arrA.length + 1];
            System.arraycopy(arrA, 0, tmp, 0, arrA.length);
            tmp[arrA.length] = obj;
        } catch (Exception e) {
            tmp = new Login[1];
            tmp[0] = obj;
        }
        guarda(arrA,"usuarios.txt");
        JOptionPane.showMessageDialog(null, "Ya ha sido registrado, ya puede iniciar sesion...");
        return tmp;
    }


Este es todo el codigo que utilizo, espero puedan ayudarme...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear un archivo con ayuda de un jtextfield

Publicado por Kabuto (1385 intervenciones) el 13/11/2018 12:34:49
Pues me temo que falta precisamente el código más importante.

No veo como está escrito el método guarda() que es el que se encarga de crear el archivo de texto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Crear un archivo con ayuda de un jtextfield

Publicado por daniel (5 intervenciones) el 13/11/2018 16:46:39
Si, perdon una disculpa aqui esta el codigo de guarda()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void guarda(Login[] arrA, String arch) {
    try {
        ObjectOutputStream objArch =
           new ObjectOutputStream(
                new FileOutputStream("src//binaries" + arch));
        System.out.println("archivo para guardar "+arch);
        for (Login a : arrA) {
            objArch.writeObject(a);
        }
 
    } catch (Exception e) {
    System.out.println("No se pudo encontrar el archivo o " +
            " no hay mas datos en el arreglo");
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear un archivo con ayuda de un jtextfield

Publicado por Kabuto (1385 intervenciones) el 13/11/2018 20:42:51
Vale.

Estás usando la clase ObjectOutputStream. Pero esta clase no crea archivos de texto. Esta clase lo que hace es convertir datos primitivos y objetos "serializables" en grupos de bytes, ya sea para transmitirlos por una red o bien para guardarlos en un archivo y luego ser recuperados.
Para que esto funcione, tu clase Login (la cuál tampoco veo su código) ha de implementar la interfaz Serializable
Esto es muy sencillo, basta con que lo indiques así:
1
2
3
public class Login implements Serializable {
   //Codigo de la clase
}

Pero repito, esto no crea un archivo de texto plano, pro mucho que le pongas extensión .txt.
Crea un archivo de bytes. Cuando quieras recuperarlo, no podrás leer "texto", tendrás que usar la clase ObjectInputStream, quien te reconstruirá el array de objetos Login[] tal cuál estaba en memoria cuando lo pasaste a archivo.

Si quieres escribir líneas de texto plano, legibles desde cualquier editor de texto como Bloc de Notas y tal.. tendrás que usar las clases BufferedWriter y FileWriter y pasarles, no el array Login[], si no los valores String que contienen.

Es más cómodo y rápido el ObjectOutputStream, sin duda, tan solo tiene dos pegas:
1.- Como ya he dicho. No crea un archivo de texto legible. Bueno, si lo abres con editores avanzados como Notepad++ y similares, verás algún dato legible mezclado entre decenas de caracteres raros y sin sentido. Pero no es texto plano.

2.- Como también he dicho, ObjectOutputStream transforma el objeto Login[] tal cuál está conformado en memoria RAM para pasarlo en bytes a un archivo y luego recuperarlo.
Esto significa que si tras haber guardado en archivo un objeto Login[], luego haces un cambio a tu clase Login (añadir un atributo, un nuevo método...), ya no podrás recuperar el objeto guardado en el archivo. Porque fue creado con una versión anterior de la clase Login, la versión de antes que hicieras la modificación.

Teniendo en cuenta estas pegas, por lo demás es mucho más rápido y cómodo que no crear lineas de texto plano con BufferedWriter.

Así que resumiendo, asegurate de que tu clase Login implementa la interfaz Serializable.
También deben implementarla las clases que esté usando como atributos.
Si por ejemplo estás usando atributos con la clase String, no hay problema porque ya la implementan de serie.
Pero si estuvieras usando alguna clase tuya propia, creada por ti, ha de implementar también Serializable.

Una vez la implementen, ya puedes escribir y leer archivos. Pero repito, no esperes poder leerlos con un editor de texto simple cualquiera. Solo agún editor avanzado, te mostrará un "puzzle" de símbolos y caracteres raros, entre los que encontrarás alguna palabra "en cristiano"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Crear un archivo con ayuda de un jtextfield

Publicado por daniel (5 intervenciones) el 14/11/2018 01:18:41
Hola de nuevo, creo que el error esta justo a la hora de escribir en el archivo, ya que si implemento la clase Login como un Serializable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.Serializable;
 
public class Login implements Serializable{
    public static final long serialVersionUID=1L;
    private String username;
    private String password;
    private String nivelAcceso;
 
    public Login (){
        nivelAcceso = "NULL";
        password = "NULL";
        nivelAcceso = "NULL";
    }
 
    public Login (String username, String password, String nivelAcceso){
        this.nivelAcceso = "";
        this.username = "";
        this.password = "";
    }
 
    public String consulta (){
        return "password"+password + "\n"+
                "username"+username + "\n"+
                "nivel de acceso"+nivelAcceso+"\n";
 
    }
//A partir de aqui se encapsulan datos
}
Entonces aqui el problema lo soluciono con BufferedWriter, gracias por tus respuestas :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar