代码之家  ›  专栏  ›  技术社区  ›  Neo Cortex

如何在Java中更新TXT文件

  •  0
  • Neo Cortex  · 技术社区  · 8 年前

    我有一个jtable,其中显示来自文本文件的数据:

    enter image description here 现在,对于删除,我有这样的方法:

    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个拆分,其中最后一个拆分用于逻辑删除。所以,如果没有删除假房间。

    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?

    例如,如果我点击超级房间,如何删除确切的房间。

    1 回复  |  直到 8 年前
        1
  •  1
  •   DevilsHnd - 退した    8 年前

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

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

    /**
     * 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"
    

    代码真的没那么长,只是有很多注释跟在后面以便解释。当然,这些注释可以从代码中删除。