【问题标题】:Why does replacing the file contents within an ArrayList return unwanted results?为什么替换 ArrayList 中的文件内容会返回不需要的结果?
【发布时间】:2022-10-16 00:49:45
【问题描述】:

如何将我编辑的文件行添加到我从 txt 文件中获取内容的同一行?

1,House mack,house,123 mack road,155,40000,40000,2022-09-29,no,Bill,123456,bill@gmail.com,12 Bill road,Jack,456789,jack@gmail.com,23 Jack road,John,789632,john@gmail.com,34 John road,
2,House John,house,123 John road,183,50000,50000,2022-09-10,yes,Bill,123456,bill@gmail.com,12 Bill road,Jack,456789,jack@gmail.com,23 Jack road,John,789632,john@gmail.com,34 John road,

但是我对 txt 文件的输出看起来像这样

1,House mack,house,123 mack road,155,40000,111,2022-09-29,no,Bill,123456,bill@gmail.com,12 Bill road,Jack,456789,jack@gmail.com,23 Jack road,John,789632,john@gmail.com,34 John road,

1,House mack,house,123 mack road,155,40000,111,2022-09-29,no,Bill,123456,bill@gmail.com,12 Bill road,Jack,456789,jack@gmail.com,23 Jack road,John,789632,john@gmail.com,34 John road,

如何让我的程序仅在已编辑的行中替换旧行,而不理会其他文件内容?

if (option.equals("cp")) {
    Array.set(values, 6, newPaid);
    findString = "\n" + values[0] + "," + values[1] + "," + values[2] + ","
        + values[3] + "," + values[4] + "," + values[5] + "," + values[6] + ","
        + values[7] + "," + values[8] + "," + values[9] + "," + values[10] + ","
        + values[11] + "," + values[12] + "," + values[13] + "," + values[14] + ","
        + values[15] + "," + values[16] + "," + values[17] + "," + values[18] + ","
        + values[19] + "," + values[20] + ",";
                                
    replaceLines(findString);
    System.out.println("Your Price has been changed and contents has been successfully updated! ");
    break;

我的方法包含所有计算

public static void replaceLines(String findString) {
    try {
        BufferedReader file = new BufferedReader(new FileReader("tasks.txt"));
        StringBuffer inputBuffer = new StringBuffer();
        String line;
    
        while ((line = file.readLine()) != null) {
            line = findString; 
            inputBuffer.append(line);
            inputBuffer.append('\n');
        }
        file.close();
    
        // write the new string with the replaced line OVER the same file
        FileOutputStream fileOut = new FileOutputStream("tasks.txt");
        fileOut.write(inputBuffer.toString().getBytes());
        fileOut.close();
    
    } catch (Exception e) {
        System.out.println("Problem reading file.");
    }
}

【问题讨论】:

  • 你在正确的球场,但应该使用java.nio.file.Files.readAllLines,寻找元素,替换它,然后再次写出集合。或者使用一些支持持久性的string list 类。在你更换的那一刻全部带有“findString”的行,而不仅仅是选定的行,或者一个选择
  • 如果您准确解释您的“编辑”是如何工作的,这也会有所帮助

标签: java arraylist while-loop txt


【解决方案1】:

特定文件记录中普遍存在的某些内容已将您指向正确的(不同的)记录以执行价格更改,无论是 ID 号、名称、地址还是其他任何内容。你需要持有任何东西。大多数将使用不同的记录 ID 号,以便您仅更改该特定记录中的数据,否则您可能会更改文件中的多个记录。

replaceLines() 方法中,findString 参数为要替换的文件和同一文件中的现有行保存一个新的(修改的)数据行。这里的问题是....替换什么线?您不会将该信息传递给您的方法。更改哪个人、地点或事物的价格?这显然需要在进行任何更改之前确定。例如,假设我们要更改 ID 为 1 的文件记录中的价格(在索引 6 处),对 replaceLines() 方法的调用应该是:

replaceLine( 1, findLines );

如果您指定记录、需要更改的列以及该特定列的新值可能是什么,则会更容易,例如:

updateRecord( 1, 6, "111" );

它可能是这样的:

public static void updateRecord(int recordID, int recordColumnIndex, String newValue) throws IOException {
    java.io.PrintWriter writer;
    try (java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.FileReader("tasks.txt"))) {
        writer = new java.io.PrintWriter("temp.tmp");
        String line;
        // Read file line by line...
        while ((line = reader.readLine()) != null) {
            if (line.trim().isEmpty()) {
                writer.println(line);
                continue;
            }
            // Split each read line to separate data.
            String[] lineParts = line.split("\s*,\s*");
            
            /* If the record ID value matches the supplied ID value
               then make the desired changes to that line.    */
            if (Integer.parseInt(lineParts[0]) == recordID) {
                lineParts[recordColumnIndex] = newValue;
                // Rebuild the data line...
                StringBuilder sb = new StringBuilder(String.valueOf(recordID));
                for (int i = 1; i < lineParts.length; i++) {
                    sb.append(",").append(lineParts[i]);
                }
                line = sb.toString();
            }
            writer.println(line);  // write line to `temp.tmp` file.
            writer.flush();        // Immediate write.
        }
    }
    writer.close();

    /* Delete the `tasks.txt` file and then rename 
       `temp.tmp` to `tasks.txt`.            */
    if (new File("tasks.txt").delete()) {
        java.nio.file.Path source = java.nio.file.Paths.get("temp.tmp");
        java.nio.file.Files.move(source, source.resolveSibling("tasks.txt"));
    }

}

如果我正在查看最初来自 tasks.txt 文件的记录列表,我可以看到 ID 为1需要将第 7 列(索引 6)中的价格从 40000 更改为 111,然后我会调用:

try {
    updateRecord(1, 6, "111");
}
catch (IOException ex) {
    System.err.println(ex.getMessage());
}

一方面:

只是好奇,你为什么用换行符开始你的文件记录( ) 字符,为什么你所有的记录都以逗号 (,) 结尾?

【讨论】:

  • 嗨@DevilsHnd 我在换行符中添加只是为了测试我的代码,并且添加了逗号是因为我创建了 3 个对象并将它们写入单个 txt 文件行,否则我的输出将被 3 个人之间的空格“”分解像这样Bill,123456,bill@gmail.com,12 Bill road 空格“”然后Jack,456789,jack@gmail.com,23 Jack road
  • 感谢您对我的问题的深入解释
  • 呃……我明白了。欢迎您@chris。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
相关资源
最近更新 更多