在Java中,如何删除符合搜索条件的文本文件中的行?
我想知道删除行字符串的最短方法,而不必重新写入没有行字符串的整个文本文件(我要删除行字符串)。 我能够使用上面的代码从文件中以字符串形式检索该行。 但不能删除。请提供帮助。正如MarsAtomic所建议的,(并更正了热舔),您不能从文件中随机删除字节 但是有两种优化是可能的在Java中,如何删除符合搜索条件的文本文件中的行?,java,arrays,text,delete-row,Java,Arrays,Text,Delete Row,我想知道删除行字符串的最短方法,而不必重新写入没有行字符串的整个文本文件(我要删除行字符串)。 我能够使用上面的代码从文件中以字符串形式检索该行。 但不能删除。请提供帮助。正如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;
}