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
和二进制搜索来加快查找相关记录的速度。同样对于大文件,您可以使用内存映射。但是,最后两个仍然需要(重新)写入文件。
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
和二进制搜索来加快查找相关记录的速度。同样对于大文件,您可以使用内存映射。但是,最后两个仍然需要(重新)写入文件。