简体   繁体   English

如何在Java中更新txt文件

[英]How to update txt file in java

I have JTable where I show data from text file: 我有JTable,其中显示了来自文本文件的数据:

在此处输入图片说明 Now, for deleting I have method like this: 现在,要删除,我有这样的方法:

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);
}

} }

And action listener: 和动作监听器:

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

It will delete row in JTable and thats okey, but my text file have 7 splits, where last spit is for logical deleting. 它将删除JTable中的行,这很好,但是我的文本文件有7个拆分,最后一个吐是用于逻辑删除。 So, if false - room isn't deleted. 因此,如果为假-不删除房间。

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

How to delete certain room from JTable on correct way, and change from false to true? 如何以正确的方式从JTable删除某些空间,并将其从false更改为true?

For example if I click on super room, how to delete exactly that room. 例如,如果我单击超级房间,如何准确删除该房间。

This sort of thing is best handled using a database rather than a text file for a great number of reasons, never the less since you are utilizing a text file as your data storage I will demonstrate one way to replace a value (substring) in a specific data text file line. 出于多种原因,最好使用数据库而不是文本文件来处理这种事情,因为您正在将文本文件用作数据存储,所以同样如此,我将演示一种替换值的方法(子字符串)。特定数据文本文件行。

Now, the following method can be used to modify any piece of field data on any file data line...even the room number so keep that in mind. 现在,以下方法可用于修改任何文件数据行上的任何字段数据……甚至房间号,因此请记住这一点。 You will need to ensure that you only modify when it's best to do so: 您将需要确保仅在最好的时候进行修改:

/**
 * 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;
}

To use this method you might want to do it this way: 要使用此方法,您可能需要这样做:

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);
}

In the code above a data file name of "HotelRoomsData.txt" was supplied. 在上面的代码中,提供了数据文件名“ HotelRoomsData.txt” This of course assumes the the data file contains that name and that is is located within the root folder (directory) of your particular project. 当然,这假定数据文件包含该名称,并且该文件位于您特定项目的根文件夹(目录)内。 If the file is named differently and it is located in some completely different location then you will need to change this to the full path and file name of the data file, for example: 如果文件的名称不同,并且位于完全不同的位置,则需要将其更改为数据文件的完整路径和文件名,例如:

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

The code really isn't that long, it's just that there are a lot of comments accompanying it so as to explain things. 该代码实际上并没有那么长,只是伴随着很多注释来解释事情。 Of course these comments can be deleted from the code. 当然,这些注释可以从代码中删除。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM