Java,如何删除文本文件中符合搜索条件的行?

In Java, How to delete a row in a text file that meets search criteria?

public static String findAndDeleteStudent(String qStudent)
{
    String fileName = "data/Students.txt";
    String findNumber = qStudent;
    File file = new File(fileName);
    Scanner dataText = null;
    String result="";

    try
    {
        dataText = new Scanner(file);
        while (dataText.hasNext())
        {
            String line = dataText.nextLine();
            if (line.contains(findNumber))
            {
                //System.out.println(line);
                //line.trim();
                //System.out.println(items[1]);
                System.out.println(line);

                result ="done";
            }
        }
    }
   catch (NumberFormatException nfe)
    {
        result = "error";
    }
    catch (NoSuchElementException nsf)
    {
        result = "error";
    }
    catch (FileNotFoundException fnf)
    {
        result = "error";
    }

    return result;
}

我想知道删除行字符串的最短方法,而不用重写没有行字符串(我想删除)的整个文本文件。 我可以使用上面的代码从文件中检索该行作为字符串。 但不能删除。请帮忙

正如 MarsAtomic 所建议的(Hot Licks 已更正)您不能从文件中随机删除字节。

但是有两个优化可能。


但是不需要完全重写文件
如果要删除的行在文件的中间,则无需触摸文件的前半部分。您只需要重写文件的后半部分。


您可以逐行扫描,一旦找到该行,就可以开始复印了。

但是在复制的时候,不需要逐行复制,你可以通过一次传输大量的行来获得更快的复制方式

希望对您有所帮助。

如果文件足够小并且您正在批量删除,那么您总是可以读入 HashMap 和 运行 .remove(qStudent)(假设密钥基于 qStudent).然后,您可以在完成所有删除后将 HashMap 写入文件。但是,如果您只是在这里或那里删除一个,那么是的,您将不得不做一些表格或(重新)编写。如果 (1) 每个条目的大小完全相同,(2) 该大小已知,并且 (3) 有一种确定的方法来定位每个学生(但不太可能),则可以随机访问文件.然后您可以使用 java.io.RandomAccessFile 及其 seek 函数跳转到确切位置。对于较大的文件,如果它们已排序,那么您可以使用 RandomAccessFile 和二进制搜索来加快查找相关记录的速度。同样对于大文件,您可以使用内存映射。但是,最后两个仍然需要(重新)写入文件。