满足相等条件时,如何替换行而不丢失文本文件中的其他行?

时间:2019-04-01 19:07:22

标签: java bufferedreader readline

我有一个文本文件,其中包含客户端数据,ID,名称和姓氏,余额和日期,文本文件中有一个客户端包含4行,然后有一个空格,另一个客户端数据开始,依此类推。

ID:33
Client: Michael Reedus
Balance: 30000 Eur
Date: 32.03.2019

ID:34
Client: Michael Snow
Balance: 31900 Eur
Date: 32.03.2019

我需要为特定的客户ID块创建行替换,以避免在不使用ID的情况下为其他人替换同一行。

我试图实现一个想法,即当代码找到我需要的ID时,它就停在那里,例如跳到下一行并编辑该行,但是,我丢失了所有其他行,但我要替换的行除外。 / p>

private static void updateLine(String fails, String ID, String toUpdate, String updated) throws IOException {
        BufferedReader file = new BufferedReader(new FileReader(fails));
        String line;
        String input = "";

        while ((line = file.readLine()) != null) {

            if (line.equals(ID)) {

                line = file.readLine();
                input += line + System.lineSeparator();

                input = input.replace(toUpdate, updated);
            }

        }

        FileOutputStream os = new FileOutputStream(fails);
        os.write(input.getBytes());

        file.close();
        os.close();
    }

我希望得到

ID:33
Client: Michael Jordan
Balance: 30000 Eur
Date: 32.03.2019

不是


Client: Michael Jordan


1 个答案:

答案 0 :(得分:1)

您遇到困难的原因有很多,以下是一些原因:

if (line.equals(ID)) {
    line = file.readLine();
    input += line + System.lineSeparator();

正如您在上面的少量代码中看到的那样,您实际上是在使用刚刚读入的行,然后直接应用到要写入文件的String中。这里的数据没有变化。应该是:

if (line.equals(ID)) {
    line = file.readLine();
    input += updated + System.lineSeparator();

打开另一罐蠕虫。如果提供的原始名称与提供的ID号不匹配怎么办。也许是输入错误。在更新文件中的特定项目之前,请将其与 toUpdate 参数中包含的内容进行比较:

if (line.equals(ID)) {
    line = file.readLine();
    if (line.equals(toUpdate)) {
        input += updated + System.lineSeparator();
    }

下一行确实让我感到困惑:

input = input.replace(toUpdate, updated);

您确实意识到 input 字符串变量最终将保存文件中包含的所有数据。如果要更新的项目位于多个ID编号不同的位置怎么办?上面的行将更改所有这些行。摆脱这些可怕的代码行。如果有的话,应仅将其应用于 line 变量(当前读入的文件行)。

下面,我发布了您的 updateLine()方法的修改版本。此版本允许您更改 ID字段之外的任何客户端字段,例如:

updateLine("clients.txt", "ID:33", "Date: 32.03.2019", "Date: 31.03.2019");

updateLine("clients.txt", "ID:34", "Client: Michael Snow", "Client: John Smith");

updateLine("clients.txt", "ID:34", "Balance: 31900", "Balance: 1253672");

下面是代码(大部分是注释):

private static void updateLine(String fails, String ID, String toUpdate, String updated) {
    // Try With Resources is used to autoclose the BufferedReader
    try (BufferedReader file = new BufferedReader(new FileReader(fails))) {
        String line;
        String input = "";
        while ((line = file.readLine()) != null) {
            if (line.equals(ID)) {
                // Append the ID to String
                input+= ID + System.lineSeparator(); 
                /* Loop through this client's data and make 
                   changes where necessary...   */
                while ((line = file.readLine()) != null) {
                    /* If we get to this point where we read an ID again
                       then we've gone too far. The item to update could
                       not be found under the supplied ID Number.  */
                    if (line.startsWith("ID:")) {
                        // Append the original ID to String.
                        System.out.println("The item to update (" + toUpdate + 
                                ") could not be found under the ID of: " + ID);
                        // Add this line to string anyways.
                        input+= line + System.lineSeparator();
                        break; // Break out of this inner lop
                    }
                    // Does file line match the supplied toUpdate?
                    if (line.equals(toUpdate)) {
                        // Yes - Append the new item to String
                        input+= updated + System.lineSeparator();
                        break; // Get out of inner loop. Let main loop take over again.
                    }
                    else {
                        // Append the original item to String.
                        input+= line + System.lineSeparator();
                    }
                }
            }
            else {
                input+= line + System.lineSeparator();
            }
        }   
        // Re-Write File with new data
        // Try With Resources is used to autoclose the Stream
        try (FileOutputStream os = new FileOutputStream(fails)) {
            os.write(input.getBytes());
            os.flush();
        }
    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
}