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

在Java中,如何删除符合搜索条件的文本文件中的行?,java,arrays,text,delete-row,Java,Arrays,Text,Delete Row,我想知道删除行字符串的最短方法,而不必重新写入没有行字符串的整个文本文件(我要删除行字符串)。 我能够使用上面的代码从文件中以字符串形式检索该行。 但不能删除。请提供帮助。正如MarsAtomic所建议的,(并更正了热舔),您不能从文件中随机删除字节 但是有两种优化是可能的 但是不需要完全重写文件 如果要删除的行位于文件的一半,则无需触摸文件的前半部分。您只需要重写文件的后半部分 您可以逐行扫描,一旦找到该行,就可以开始复制 但是在复制时,不需要逐行进行,您可以通过一次传输大量行来寻求更快的

我想知道删除行字符串的最短方法,而不必重新写入没有行字符串的整个文本文件(我要删除行字符串)。 我能够使用上面的代码从文件中以字符串形式检索该行。 但不能删除。请提供帮助。

正如MarsAtomic所建议的,(并更正了热舔),您不能从文件中随机删除字节

但是有两种优化是可能的


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


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

但是在复制时,不需要逐行进行,您可以通过一次传输大量行来寻求更快的复制方式


希望这会有所帮助。

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

您不能随机访问文件,因此必须执行您不想执行的操作。可能重复感谢兄弟。我会试试看。文件可以随意访问。甚至可以随机修改文件。但是,如果不重写文件的“尾部”,文件不能从中间添加或删除字节。
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;
}