如何在java中更新txt文件

新皮质

我有 JTable,我在其中显示文本文件中的数据:

在此处输入图片说明 现在,删除我有这样的方法:

private void delete(ActionEvent evt) {
    DefaultTableModel model = (DefaultTableModel) tblRooms.getModel();
    // get selected row index
    try {
        int SelectedRowIndex = tblRooms.getSelectedRow();
        model.removeRow(SelectedRowIndex);
} catch (Exception ex) {
    JOptionPane.showMessageDialog(null, ex);
}

}

和动作监听器:

btnDelete.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                delete(e);
            }
        });

它将删除 JTable 中的行,这很好,但我的文本文件有 7 个拆分,其中最后一个拆分用于逻辑删除。因此,如果为 false - 房间不会被删除。

13|family room|name apartman|4|true|true|true|false
14|superior room|super room|2|true|false|false|false
15|room|room for one|1|false|false|true|false
0|MisteryRoom|Mistery|0|true|true|free|false

如何以正确的方式从 JTable 中删除某个房间,并将其从 false 更改为 true?

例如,如果我单击超级房间,如何准确删除该房间。

恶魔之手

出于多种原因,最好使用数据库而不是文本文件处理这类事情,尤其是因为您使用文本文件作为数据存储,我将演示一种替换值(子字符串)的方法特定数据文本文件行。

现在,以下方法可用于修改任何文件数据行上的任何字段数据……甚至是房间号,因此请记住这一点。您需要确保仅在最佳情况下进行修改:

/**
 * Updates the supplied Room Number data within a data text file. Even the
 * Room Number can be modified.
 * 
 * @param filePath (String) The full path and file name of the Data File.
 * 
 * @param roomNumber (Integer - int) The room number to modify data for.
 * 
 * @param fieldToModify (Integer - int) The field number in the data line to 
 * apply a new value to. The value supplied here is to be considered 0 based 
 * meaning that 0 actually means column 1 (room number) within the file data 
 * line. A value of 7 would be considered column 8 (the deleted flag).
 * 
 * @param newFieldValue (String) Since the file is string based any new field 
 * value should be supplied as String. So to apply a boolean true you will need 
 * to supply "true" (in quotation marks) and to supply a new room number that 
 * room number must be supplied a String (ie: "666").
 * 
 * @return (Boolean) True if successful and false if not.
 */
public boolean updateRoomDataInFile(String filePath, int roomNumber,
        int fieldToModify, String newFieldValue) {
    // Try with resources so as to auto close the BufferedReader.
    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line;
        // Add the data file contents to a List interface...
        List<String> dataList = new ArrayList<>();
        while ((line = reader.readLine()) != null) {
            dataList.add(line);
        }

        for (int i = 0; i < dataList.size(); i++) {
            line = dataList.get(i).trim();  // Trim off any leading or trailing whitespaces (if any).
            // Skip Blank lines (if any) and skip Comment lines (if any).
            // In this example file comment lines start with a semicolon.
            if (line.equals("") || line.startsWith(";")) {
                continue;
            }
            //Split each read line so as to collect the desired room number
            // since everything will always be based from this unique ID number.
            // Split is done baesed on the Pipe (|) character since this is
            // what is implied with your data example.
            String[] roomData = line.split("\\|");
            // Get the current file data line room number.
            // Make sure the first piece of data is indeed a valid integer room 
            // number. We use the String.matches() method for this along with a 
            // regular expression.
            if (!roomData[0].trim().matches("\\d+")) {
                // If not then inform User and move on.
                JOptionPane.showMessageDialog(null, "Invalid room number detected on file line: "
                        + (i + 1), "Invalid Room Number", JOptionPane.WARNING_MESSAGE);
                continue;
            }
            // Convert the current data line room number to Integer 
            int roomNum = Integer.parseInt(roomData[0]);
            // Does the current data line room number equal the supplied 
            // room number?
            if (roomNum != roomNumber) {
                // If not then move on...
                continue;
            }

            // If we reach this point then we know that we are currently on 
            // the the data line we need and want to make changes to.
            String strg = "";  // Use for building a modified data line.
            // Iterate through the current data line fields
            for (int j = 0; j < roomData.length; j++) {
                // If we reach the supplied field number to modify
                // then we apply that modification to the field.
                if (j == fieldToModify) {
                    roomData[j] = newFieldValue;
                }
                // Build the new data line. We use a Ternary Operator, it is
                // basicaly the same as using a IF/ELSE.
                strg += strg.equals("") ? roomData[j] : "|" + roomData[j];
            }
            // Replace the current List element with the modified data.
            dataList.set(i, strg);
        }

        // Rewrite the Data File.
        // Try with resources so as to auto close the FileWriter.
        try (FileWriter writer = new FileWriter(filePath)) {
            // Iterate through the List and write it to the data file.
            // This ultimately overwrites the data file.
            for (int i = 0; i < dataList.size(); i++) {
                writer.write(dataList.get(i) + System.lineSeparator());
            }
        }
        // Since no exceptions have been caught at this point return true 
        // for success.
        return true;
    }
    catch (FileNotFoundException ex) {
        Logger.getLogger("updateFileRoomStatus()").log(Level.SEVERE, null, ex);
    }
    catch (IOException ex) {
        Logger.getLogger("updateFileRoomStatus()").log(Level.SEVERE, null, ex);
    }
    // We must of hit an exception if we got
    // here so return false for failure.
    return false;
}

要使用此方法,您可能希望这样做:

private void delete() {
    DefaultTableModel model = (DefaultTableModel) tblRooms.getModel();
    try {
        // get selected row index 
        int SelectedRowIndex = tblRooms.getSelectedRow();
        // Get out if nothing was selected but the button was.
        if (SelectedRowIndex == -1) { return; }
        int roomNumber = Integer.parseInt(model.getValueAt(SelectedRowIndex, 0).toString());
        updateRoomDataInFile("HotelRoomsData.txt", roomNumber, 7, "true");
        model.removeRow(SelectedRowIndex);
} catch (Exception ex) {
    JOptionPane.showMessageDialog(null, ex);
}

在上面的代码中,提供了一个名为“HotelRoomsData.txt”的数据文件这当然假设数据文件包含该名称并且位于特定项目的根文件夹(目录)中。如果文件的名称不同并且位于完全不同的位置,则您需要将其更改为数据文件的完整路径和文件名,例如:

"C:/Users/Documents/MyDataFile.txt"

代码其实并没有那么长,只是附带了很多注释来解释事情。当然这些注释可以从代码中删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章