Java使用JTable重写txt文件时首行丢失的问题如何解决?
问题根因
你在加载文件到JTable的逻辑里,将文件第一行单独读取作为了JTable的列标识符(表头),没有作为行数据存入TableModel,所以执行写回文件操作时,这行数据自然不会被遍历写入,导致首行丢失。
修复方案
方案1:确认文件第一行是表头,需要保留
修改updateActionPerformed方法,在写入行数据之前,先把列名写入文件第一行:
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); // 新增:先写入表头(列名) TableModel model = datatable.getModel(); for(int j = 0; j < model.getColumnCount(); j++){ bw.write(model.getColumnName(j) + ","); } bw.write("\n"); // 原有写入行数据逻辑 for (int i = 0; i < model.getRowCount(); i++){ for(int j = 0; j< model.getColumnCount(); j++){ bw.write(model.getValueAt(i,j)+","); } bw.write("\n"); } bw.close(); fw.close(); } catch(Exception e) { JOptionPane.showMessageDialog(null,"Error, please retry"); } }
方案2:文件无表头,所有行都是业务数据
修改viewbtnActionPerformed加载逻辑,不要把第一行设为列名,直接全部加载为行数据,列名预设为固定值即可:
private void viewbtnActionPerformed(java.awt.event.ActionEvent evt) { try{ BufferedReader br = new BufferedReader(new FileReader("logindata.txt")); DefaultTableModel model = (DefaultTableModel)datatable.getModel(); // 新增:设置固定列名,不再读取文件第一行当表头 model.setColumnIdentifiers(new String[]{"用户名","密码"}); // 可根据实际业务调整列名 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(); } catch(Exception ep){ Logger.getLogger(people_info.class.getName()).log(Level.SEVERE, null, ep); } }
补充优化建议:所有IO流操作建议使用try-with-resources语法自动关闭,避免手动关闭异常导致的资源泄漏
内容的提问来源于stack exchange,提问作者godopetza
相关产品推荐
相关产品推荐

