我目前能够从我的.txt文件中删除记录的方法是将所有字符都设置为空,但遗憾的是它只是将这些单位设为空并且不会删除这些单位。你知道如何在不重写整个文件的情况下从txt文件中完全删除一行记录吗?
protected boolean DeleteObject(int mID)
{
try {
file = new RandomAccessFile(new File("UserDB.txt"), "rw");
long FileSize = file.length();
file.seek(0);
long NUMRecords = FileSize / RECORD;
for (int j=0; j < NUMRecords; j++) {
sID = file.readUTF();
for (int i = 0; i < 10 - sID.length(); i++) {
file.readByte();
}
ID = Integer.parseInt(sID);
fName = file.readUTF();
for (int i = 0; i < 20 - fName.length(); i++) {
file.readByte();
}
surname = file.readUTF();
for (int i = 0; i < 20 - surname.length(); i++) {
file.readByte();
}
sMajor = file.readUTF();
for(int i=0; i<3-sMajor.length(); i++){
file.readByte();
}
major = Integer.parseInt(sMajor);
if(ID == mID)
{
file.seek(j*RECORD);
for(int k =0; k<RECORD; k++)
{
file.writeUTF("");
}
return true;
}
}
}
catch (IOException e) {
System.out.println("ERROR IN DELETING FILE "+e);
e.getStackTrace();
}
System.out.println("Nothing Found");
return false;
}
答案 0 :(得分:1)
您可以将文件设计为包含逻辑删除标志。 删除记录时,您将更新逻辑删除标记,将记录标记为已删除,而不是将其从文件中物理删除。
答案 1 :(得分:1)
我曾经有一个用作队列的文件。这个概念是删除总是线性地发生,因为它是一个队列。因此删除过程只会重写下一个未删除行的文件偏移量。
我将文件的前8个字节保留为文件指针(其值为8或更高)。这使文件成为二进制文件,而不是txt。您可以在兄弟文件中编写该偏移量。
然而,这是一个队列,我不得不不时创建新文件,并且收集完全删除的文件。
否则,你不能删除文件部分。每行必须有自己的删除标志。吸尘/包装/管理自由空间(或重写干净版本)对于每个数据库都是一个悲惨的现实。