Autor Tema: Programa de Java: Como guardar datos a .txt  (Leído 440 veces)

jmoney

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Programa de Java: Como guardar datos a .txt
« en: 05 de Junio 2021, 23:44 »
Hola a tod@s!

Estoy batallando con un programa de Java, no encuentro la manera de guardar la informacion que capturo a un .txt file.

(Soy nuevo en Java) - cualquier ayuda seria agredecida! Les comparto mi codigo.

El codigo funciona, aunque no le e terminado al 100%, pero quiero ver como es que puedo guardar la informacion que ingrese a un archivo de .txt. Tambien, es posible guardar en un archivo .csv en Excel?


MAIN
Código: [Seleccionar]
package Evidencia.java;
import javax.swing.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    private static ArrayList<Admin> administradores = new ArrayList<Admin>();
    private static Scanner scanner = new Scanner(System.in);


    public static void main(String[] args) {
        crearAdmins();
        Doctor nuevoDoctor = new Doctor();
        String filepath = "citas.txt";


        if (validarAcceso()) {
            System.out.println("\nUsuario autorizado\n");

            System.out.println("Cual es el Nombre del Doctor?");
            nuevoDoctor.setNombre(scanner.nextLine());

            System.out.println("Cual es el Apellido del Doctor?");
            nuevoDoctor.setApellidos(scanner.nextLine());

            System.out.println("Cual es el ID del Doctor?");
            nuevoDoctor.setId(scanner.nextLine());

            System.out.println("Cual es la Especialidad del Doctor?");
            nuevoDoctor.setEspecialidad(scanner.nextLine());

            System.out.println(nuevoDoctor.mostrar());

            saveRecord(nuevoDoctor.getId(),nuevoDoctor.getNombre(),nuevoDoctor.getEspecialidad(),filepath);
        }
        else
            System.out.println("\nUsuario no autorizado.");

        System.out.println("\n Fin del Programa");

    }

    private static void crearAdmins() {
        administradores.add(new Admin("Admin", "007"));
        administradores.add(new Admin("SuperAdmin", "ajit0oCt5!"));
    }

    private static boolean validarAcceso( ) {

        System.out.println("Accediendo al Programa");
        System.out.print("Usuario: ");
        String nombre = scanner.nextLine();
        System.out.print("Password: ");
        String password = scanner.nextLine();

        Admin admin = new Admin(nombre, password);

        return administradores.contains(admin);

    }

    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);

            pw.println(id+","+doctor+","+especialidad);
            pw.flush();
            pw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }
}

Doctor
Código: [Seleccionar]
package Evidencia.java;

import javax.swing.JOptionPane;

public class Doctor {

    private String id;
    private String nombre;
    private String apellidos;
    private String especialidad;

    public String generaLineaCSV() {
        return String.format("%s;%s;%s;%s\n", id, nombre, apellidos, especialidad);
    }

    public Doctor() {
        super();
        this.id = id;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.especialidad = especialidad;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getEspecialidad() {
        return especialidad;
    }

    public void setEspecialidad(String especialidad) {
        this.especialidad = especialidad;
    }


    public String mostrar() {
        return "ID: " + id + "\nNombre: " + nombre
                + "\nApellidos: " + apellidos + "\nEspecialidad: " + especialidad;
    }

}

Admin
Código: [Seleccionar]
package Evidencia.java;

public class Admin {

    private String nombre;
    private String password;

    public Admin(String nom, String pass) {
        nombre = nom;
        password = pass;
    }

    @Override
    public boolean equals(Object objeto) {
        if (objeto instanceof Admin) {
            Admin otroAdmin = (Admin)objeto;
            if (nombre.equals(otroAdmin.nombre) && password.equals(otroAdmin.password))
                return true;
            else
                return false;
        }
        else
            return false;
    }

}

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: Programa de Java: Como guardar datos a .txt
« Respuesta #1 en: 06 de Junio 2021, 01:31 »
Hola.

Prueba sin el PrintWriter.

Con BufferedWriter debería bastarte:

Código: [Seleccionar]
    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(id+","+doctor+","+especialidad);
            bw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }


Sobre el CSV.

Un CSV es simplemente un archivo de texto plano con valores separados por comas... así que en realidad ya lo estás creando.

Solo tendrías que cambiar el nombre del archivo para que se guarde como .csv y no como  .txt.
Más que nada para que el sistema operativo sepa con que programa debe asociar ese archivo.
Eso, y un salto de línea tras cada escritura de datos:

Código: [Seleccionar]
    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(id+","+doctor+","+especialidad);
            bw.newLine(); //Salto de línea
            bw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }


Pruébalo y nos cuentas.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jmoney

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: Programa de Java: Como guardar datos a .txt
« Respuesta #2 en: 06 de Junio 2021, 02:20 »
Muchas gracias Kabuto!  ;D

¡Todo funciono! Me acabo de dar cuenta que estaba buscando él .txt en el lugar incorrecto, entonces por eso pensaba que no se estaba actualizando  :-[

¡Ya también lo cambié el archivo a .csv!

Voy a seguir trabajando en el resto del programa, tengo varias clases que tengo que hacer. ¿Una preguntita, si quiero poder crear él .csv con su títulos de columna fijo, y que esos no se repitan - como se hace eso?

Actualmente, si agrego los títulos de las columnas, se están repitiendo cada vez que corro el programa.

Código: [Seleccionar]
    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write("#ID"+","+ "Doctor" + ","+ "Especialidad");
            bw.newLine();
            bw.write(id+","+doctor+","+especialidad);
            bw.newLine();
            bw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: Programa de Java: Como guardar datos a .txt
« Respuesta #3 en: 06 de Junio 2021, 14:10 »
Hola.

Para no repetir la cabecera, tendrías que cambiar la estrategia.

Antes de escribir datos, comprobar si YA existe o NO existe el archivo .csv.

Si NO existe, porque es la primera vez que se ejecuta el programa, pues haces una primera escritura de solo los datos de la cabecera.

Si YA existe, debemos dar por hecho que ya contiene la cabecera, y solo escribirías los datos.

La comprobación la puedes hacer en ese mismo método, o en otro a parte.
Si lo haces por separado, puedes hacer ese método de tipo boolean, de manera que si el archivo YA existe, o no existe pero sea ha creado correctamente, retorne TRUE.
Si no consigue crearlo (por el motivo que sea), retornaría FALSE.

Así, en el método donde guardas los datos en csv, si este segundo método de comprobación no te da el "visto bueno" retornando TRUE, pues entonces no intentar guardar ningún dato, porque no te va a ser posible de todos modos.

Por ejemplo:

Código: [Seleccionar]
private static boolean checkFile(String filepath) {

File fichero = new File(filepath);
if (!fichero.exists()) //Si NO existe, lo creamos e iniciamos cabecera
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fichero));
bw.write("#ID,Doctor,Especialidad");
bw.newLine();
bw.close();
return true; //La creación fue BIEN :)
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"No se pudo crear: " + filepath);
return false; //La creación fue mal :(
}
else //Fichero YA existe
return true; //Como ya existe, NADA que hacer, damos el visto bueno ;)
}

public static void saveRecord(String id,String doctor,String especialidad, String filepath){

if (checkFile(filepath)) { //Solo si checkfile() retorna TRUE, intentaremos guardar datos
try{
FileWriter fw = new FileWriter(filepath, true);
BufferedWriter bw = new BufferedWriter(fw);
//No se necesita cabecera, ya la tiene el archivo existente
bw.write(id+","+doctor+","+especialidad);
bw.newLine();
bw.close();

JOptionPane.showMessageDialog(null,"Record Saved!");
}
catch(Exception E){
JOptionPane.showMessageDialog(null,"Record Not Saved!");

}
}
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

flyboy

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: Programa de Java: Como guardar datos a .txt
« Respuesta #4 en: 03 de Julio 2021, 08:04 »
No sé que versión de JDK uses, pero actualmente este código se puede mejorar.
Sugerencia para que lo tengas en cuenta:

En lugar de usar try-catch-finally, usa try with resources (desde JDK8) y el keyword var (desde JDK10):
try(var fw = new FileWriter(filepath, true);
      var bw = new BufferedWriter(fw)){
  // Tu código
}catch(IOException e){
 //Maneja exception
}//Ya no necesitas invocar a ningún .close, eso se hará automáticamente.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: Programa de Java: Como guardar datos a .txt
« Respuesta #5 en: 03 de Julio 2021, 11:38 »
Gracias por tu aportación  ;)

El close() suelo ponerlo más que nada para que Eclipse no me señale la clase con un warning, que me da mucha tirria  :P

El "var" me resisto a usarlo en los ejemplos porque hay muchísimos estudiantes que en sus centros de estudios compilan con JDK's antiguos, así que intento que el código sea lo más retrocompatible posible.

De nuevo agradezco tu aportación, espero poder ver muchas más por aquí.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".