【问题标题】:Trying to remove specific strings from text files尝试从文本文件中删除特定字符串
【发布时间】:2014-03-05 14:56:43
【问题描述】:

我在让这个函数工作时遇到了一些麻烦,所以在这里提供一点上下文。这就是一个按钮,用于从 3 个不同的文本文件中删除一行。它通过从主 GUI 中的文本字段中获取要删除的字符串来确定要删除的字符串,然后搜索相关文件以查找字符串。一旦找到字符串,它们就会被写入一个临时文件并刷新。

此代码确实有效,但仅适用于第一个文件。我对这段代码的唯一问题是最后的重命名由于某种原因不起作用?我需要将文件重命名为原始文件,这样我的软件的其余部分才能正常运行。

请问有人可以帮忙吗? :)

removeButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    // TODO
                    String name = reminderNameField.getText();
                    String date = reminderDate.getText();
                    String details = reminderDetailsField.getText();

                    File fileName = new File("reminderNames.txt");
                    File fileDate = new File("reminderDate.txt");
                    File fileDetails = new File("reminderDetails.txt");


                    try {
                    File tempFileN = new File(fileName.getAbsoluteFile() + ".tmp");
                    File tempFileD = new File(fileDate.getAbsoluteFile() + ".tmp");
                    File tempFileC = new File(fileDetails.getAbsoluteFile() + ".tmp");

                    BufferedReader brName = new BufferedReader(new FileReader("reminderNames.txt"));
                    BufferedReader brDate = new BufferedReader(new FileReader("reminderDate.txt"));
                    BufferedReader brDetails = new BufferedReader(new FileReader("reminderDetails.txt"));

                    PrintWriter pwName = new PrintWriter(new FileWriter(tempFileN));
                    PrintWriter pwDate = new PrintWriter(new FileWriter(tempFileD));
                    PrintWriter pwDetails = new PrintWriter(new FileWriter(tempFileC));

                    String lineN = null;
                    String lineD = null;
                    String lineC = null;
                    while ((lineN = brName.readLine()) !=null && (lineD = brDate.readLine()) !=null && (lineC = brDetails.readLine()) !=null) {
                        if(!lineN.trim().equals(name) && !lineD.trim().equals(date) && !lineC.trim().equals(details)) {
                            pwName.println(lineN);
                            pwName.flush();
                            pwDate.println(lineD);
                            pwDate.flush();
                            pwDetails.println(lineC);
                            pwDetails.flush();
                        }
                    }

                    pwName.close();
                    pwDate.close();
                    pwDetails.close();

                    brName.close();
                    brDate.close();
                    brDetails.close();

                    fileName.delete();
                    fileDate.delete();
                    fileDetails.delete();

                    if(!tempFileN.renameTo(fileName)) {
                        System.out.println("Cannot rename file");
                    }
                    if(!tempFileD.renameTo(fileDate)) {
                        System.out.println("Cannot rename file date");
                    }
                    if(!tempFileC.renameTo(fileDetails)) {
                        System.out.println("Cannot rename file details");
                    }

* 更新 * 写了这个确实有效的方法,但是由于某种原因它只适用于一个文件?谁能告诉我为什么?

public void removeReminder(File a, String search) throws IOException {

File tempFile = new File(a.getAbsolutePath() + ".tmp");
BufferedReader br = new BufferedReader(new FileReader(a));
PrintWriter pw = new PrintWriter(new FileWriter(tempFile));
String line = null;

while ((line = br.readLine()) != null) {
    if (!line.trim().equals(search)) {
        pw.println(line);
        pw.flush();
    }
}
pw.close();
br.close();

a.delete();

tempFile.renameTo(a);

}

【问题讨论】:

  • 我很困惑。为什么没有一个函数来一次处理一个文件并只遍历三个文件?
  • 我开始认为这会容易得多,但是在尝试让它工作时遇到了很多麻烦?你会如何建议这样做?
  • 为一个文件编写一个方法。确保首先有效。一旦这样做,很可能(a)你的问题会神奇地消失,或者(b)问题会神奇地变得明显。
  • 感谢戴夫的帮助。想想我只是盯着一件到很长时间。我按照你说的做了,效果很好!非常感谢您的宝贵时间! :)
  • 做太多的方法很难推理;分解问题通常会使它们更容易解决:) 很高兴你让它工作了。

标签: java string text file-io


【解决方案1】:

尝试从文件中读取文本:

 public static String readAllText(String filename) throws Exception {
    StringBuilder sb = new StringBuilder();
    Files.lines(Paths.get(filename)).forEach(sb::append);
    return sb.toString();
}

然后您可以使用 .replace 删除或更改:

String file1 = readAllText("temp.tmp"); file1.replace(fileName,"");

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多