如何删除文本文件java中的一行?

时间:2014-12-16 19:17:20

标签: java

基本上我有这个代码..我希望能够在文本文件中显示删除一行..

示例:

Gab 223-2587
Mark 221-5678
Reca 227-7589
Feb 224-8597

命令:

remove Mark

文本文件中的结果应为:

Gab 223-2587
Reca 227-7589
Feb 224-8597

我的问题是,它没有删除我要删除的行..并且文本文件变空..或者如果我添加联系人然后尝试删除现有联系人..该文件将只包含最近添加的联系人..

这是我的代码:

  File inputFile = new File("C:/Users/Gab Real/workspace/CSc121/MyContacts.txt");
    System.out.println(String.format("File.canWrite() says %s", inputFile.canWrite()));

    BufferedReader reader = new BufferedReader(new FileReader(inputFile));
    Scanner scan = new Scanner(System.in);
    String word = "";
    String currentline = " ";
    StringBuilder fileOutput = new StringBuilder();

    while((currentline = reader.readLine()) != null) {
        fileOutput.append(currentline + "\r\n");
    }

    PrintWriter out = new PrintWriter(inputFile);
    out.println(fileOutput.toString());


    if(word.startsWith("add")){
        out.append(entries[1] + " " + entries[2] + "\r\n");
        //out.println(out.toString());
        //out.write("\r\n");
    } 
//my if condition to remove a line
    else if (word.contains("remove")){
            String currentLine;
            while((currentLine = reader.readLine()) != null) {
                // trim newline when comparing with lineToRemove
                String trimmedLine = currentLine.trim();
                if(trimmedLine.contains(entries[1])) continue;
                out.append(currentLine + System.getProperty("line.separator")); 
            }

3 个答案:

答案 0 :(得分:2)

PrintWriter out = new PrintWriter(inputFile);

AAARGH。请从不命名输出文件inputFile ...

enter image description here

另外,请勿对DOS换行符"\r\n"进行硬编码。这使您的程序不可移植。

除此之外,你的程序逻辑完全被破坏了......

您已阅读第一个

中的所有行
while((currentline = reader.readLine()) != null) {

您第二次尝试过滤线条失败,因为您已经在文件末尾,从您上面的第一次阅读开始。

两种解决方案:

  1. 在您需要之前,请不要阅读该文件,或者每次重读

  2. 只将一次读入可修改的数据结构,例如LinkedList<String>。做所有修改;最后一次把它写出来。

答案 1 :(得分:1)

您无法同时读取和写入同一文件。在创建PrintWriter之前,先将所有内容都读入内存,或者写入另一个文件(然后,可能在完成后将其复制到原始文件中)。

此外,写完后,请务必.close()作者。

哦,是的,你不能两次读同一个读者。如果您想从头开始阅读,请创建一个新的阅读器。

答案 2 :(得分:0)

您的计划混淆了一些问题。尝试将它们分开。

public static void main(String[] args) {
  ...
  String command = ...; // take it from args somehow
  String marker = ...; 
  ...
  if ('remove'.equals(command)) removeLine(marker);
  else if...
  ...
}

void removeLine(marker) {
  // open files as you already do
  while((currentline = reader.readLine()) != null) {
     if (currentLine.indexOf(marker) < 0) {
       output.writeln(currentLine);
     } // else the line is skipped
  }
  // close files
}