【问题标题】:Deleting a line in a text; method not working删除文本中的一行;方法不起作用
【发布时间】:2020-07-14 13:42:14
【问题描述】:

我在网上找到的所有其他解决此问题的方法似乎都没有帮助。

我有一个方法,它应该在填充的文本文件中找到特定的行。除找到的行之外的所有行都必须写入一个新的空文本文件,该文件将重命名为原始填充文件。文本文件示例如下(文本之间没有任何行,只是格式问题):

数学#Term Test#2020-01-10#0.5#0

Science#Term Test#2020-01-11#0.5#0

Accounting#Term Test#2020-01-12#0.5#0

信息技术#Term Test#2020-01-13#0.25#0

数学#课堂测试#2020-01-14#0.25#0

我的学校项目,基本上是高中学生学业评估的经理。我们必须使用文本文件来存储数据。在这种情况下,一个主题可以有多个评估,并且评估可以具有相同的名称,但不属于同一主题。因此,一行的关键标识符是主题名称(第一个)和评估名称(第二个)的组合。这由哈希(“#”)分隔。

CheckIfPresentInFile 方法读取文件并在文件中存在名称(主题和评估名称的组合)时返回布尔值 (true)。

我得到输出“已完成”,但是当我检查文本文件时,要删除(或更确切地说是删除)的行,评估从未被删除。它与文件中的文本完全相同。请帮忙。

我认为可能是 BufferedReader 或 BufferedWriter 没有正确关闭,但我没有足够的 Java 经验或知识来解决这个问题。到目前为止,我的很多代码都依赖于这种方法。

public static boolean deleteAssessment(Assessment inAssessment) {

        boolean successful;

        String printLine = inAssessment.getSubject() + "#" + inAssessment.getAssessmentName()
                + "#" + inAssessment.getDueDate() + "#" + inAssessment.getWeight() + "#" + inAssessment.getGoal();

        String inName = inAssessment.getSubject() + "#" + inAssessment.getAssessmentName();
        Subject mySub = Tools.searchSubjectArr(inAssessment.getSubject(), Tools.loadSubject());

        if (CheckIfPresentInFile("Assessments.txt", inName) == true) {
            try {
                File inputFile = new File("Assessments.txt");
                File tempFile = new File("myTempFile.txt");

                BufferedReader reader = new BufferedReader(new FileReader(inputFile));
                BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

                String lineToRemove = printLine;
                String currentLine;

                while ((currentLine = reader.readLine()) != null) {
                    String trimmedLine = currentLine.trim();
                    if (trimmedLine.equals(lineToRemove)) {
                        continue;
                    }
                    writer.write(currentLine + System.getProperty("line.separator"));
                }
                writer.close();
                reader.close();
                inputFile.delete();
                tempFile.renameTo(inputFile);
                System.out.println("Completed");
            } catch (IOException e) {
            }
            successful = true;
        } else {
            JOptionPane.showMessageDialog(null, "Warning: " + inAssessment.getAssessmentName() + " does not exist" + "\nTry again");
            successful = false;
        }
        return successful;
    }

【问题讨论】:

  • 大声笑“getAssName”
  • 您是否尝试过使用调试器来单步执行此程序?
  • 是的,我有,但无济于事......
  • 检查文件是否真的被替换了。如果不是,请使用调试器检查行相等性是否为所需行返回 true。
  • 看起来你从未输入过这个 if 语句:if (trimmedLine.equals(lineToRemove)) {if 内的 continue 之前i> 添加以下行:System.out.println("FOUND!"); 然后运行您的程序,看看它是否打印 FOUND!如果不是,则表明您正在错误地构建printLine。除非您 edit 您的问题并发布 minimal reproducible example,否则我无能为力。也许你可以上传你的文本文件并提供一个链接?

标签: java text-files bufferedreader delete-file bufferedwriter


【解决方案1】:

已解决:我从未添加过数据类型。 printLine 的最后一个属性是双精度。在文本文件中,它被存储为 0。double 被打印为 0.0,使得 if 语句永远不会为真。更改文本文件可以解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2014-02-18
    • 2018-12-22
    • 2016-08-30
    • 1970-01-01
    • 2012-09-18
    • 2013-06-03
    • 2012-10-26
    相关资源
    最近更新 更多