es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estoy intentando reescribir un archivo txt utilizando JTable en Java, pero borra la primera línea cada vez.

Estoy tratando de reescribir “dat” en mi archivo de texto con el siguiente código.

private void updateActionPerformed(java.awt.event.ActionEvent evt) { 
    try{
        File file = new File ("logindata.txt");
        if(!file.exists()){
            file.createNewFile();
        }

        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        for (int i = 0; i < datatable.getRowCount(); i++){
            for(int j = 0; j< datatable.getColumnCount(); j++){
                bw.write(datatable.getModel().getValueAt(i,j)+",");
            }
            bw.write("\n");
        }
        bw.close();
        fw.close();
       }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null,"Error, please retry");
    }
}     

Aquí está la función de modificación en la GUI.

private void modifybtnActionPerformed(java.awt.event.ActionEvent evt) { 
    int i = datatable.getSelectedRow();
    DefaultTableModel model = (DefaultTableModel)datatable.getModel();
    if (i >= 0)
    {
        model.setValueAt(newusername.getText(), i, 0);
        model.setValueAt(newpass.getText(), i, 1);
    }
    else
    {
        JOptionPane.showMessageDialog(null, "Error");
    }
}   

Código para ver el archivo de texto en la tabla.

private void viewbtnActionPerformed(java.awt.event.ActionEvent evt) { 
    try{
        BufferedReader br = new BufferedReader(new FileReader("logindata.txt"));
        String firstLine = br.readLine().trim();
        String[] columnsName = firstLine.split(",");
        DefaultTableModel model = (DefaultTableModel)datatable.getModel();
        model.setColumnIdentifiers(columnsName);
        model.setRowCount(0);

        Object[] tableLines = br.lines().toArray();

        for(int i = 0; i < tableLines.length; i++)
        {
            String line = tableLines[i].toString().trim();
            String[] dataRow = line.split(",");
            model.addRow(dataRow);
        }
    }
    catch(Exception ep){
        Logger.getLogger(people_info.class.getName()).log(Level.SEVERE, null, ep);
    }
}  

Cuando lo ejecuto, modifica el contenido en el archivo de texto, pero siempre elimina la primera línea. ¿Cómo puedo evitar esto?

Antes de la modificación

Después de la modificación

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la forma en que se actualiza el archivo logindata.txt. Cuando se llama al método updateActionPerformed, sobrescribe todo el contenido del archivo con los datos actualizados de la datatable. Esto significa que la primera línea, que contiene la información del encabezado, también se sobrescribe y se pierde.

    Para evitar que esto suceda, una solución sería leer primero el contenido del archivo original logindata.txt en la datatable, actualizar los valores requeridos en la datatable utilizando el método modifybtnActionPerformed, y luego escribir toda la datatable de nuevo en el archivo logindata.txt.

    Aquí está una versión actualizada del método updateActionPerformed que implementa este enfoque:

    private void updateActionPerformed(java.awt.event.ActionEvent evt) {                                       
        try {
            File file = new File("logindata.txt");
            if(!file.exists()) {
                file.createNewFile();
            }
    
            // Leer el contenido actual del archivo en la tabla de datos
            BufferedReader br = new BufferedReader(new FileReader(file));
            String firstLine = br.readLine().trim();
            String[] columnsName = firstLine.split(",");
            DefaultTableModel model = (DefaultTableModel)datatable.getModel();
            model.setColumnIdentifiers(columnsName);
            model.setRowCount(0);
            Object[] tableLines = br.lines().toArray();
            for (int i = 0; i < tableLines.length; i++) {
                String line = tableLines[i].toString().trim();
                String[] dataRow = line.split(",");
                model.addRow(dataRow);
            }
            br.close();
    
            // Actualizar los valores requeridos en la tabla de datos
            int i = datatable.getSelectedRow();
            if (i >= 0) {
                model.setValueAt(newusername.getText(), i, 0);
                model.setValueAt(newpass.getText(), i, 1);
            } else {
                JOptionPane.showMessageDialog(null, "Error");
            }
    
            // Escribir toda la tabla de datos de nuevo en el archivo
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(firstLine + "\n");
            for (int j = 0; j < model.getRowCount(); j++) {
                for (int k = 0; k < model.getColumnCount(); k++) {
                    bw.write(model.getValueAt(j, k) + ",");
                }
                bw.write("\n");
            }
            bw.close();
            fw.close();
        } catch(Exception e) {
            JOptionPane.showMessageDialog(null, "Error, por favor inténtelo de nuevo");
        }
    }
    

    Este método actualizado primero lee la información del encabezado y los datos del archivo original logindata.txt en la datatable. Luego, se actualizan los valores requeridos en la datatable. Finalmente, se escribe toda la datatable de nuevo en el archivo, incluyendo la información de encabezado original.

    Con este enfoque modificado, la información del encabezado ya no debería perderse al actualizar el contenido del archivo logindata.txt.

Comments are closed.