繁体   English   中英

使用RandomAccessFile删除记录

[英]Delete a record using RandomAccessFile

我目前能够从.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;
}

您可以将文件设计为包含逻辑删除标志。 删除记录时,您将更新逻辑删除标志,将记录标记为已删除,而不是将其从文件中物理删除。

我曾经有一个文件打算作为队列。 概念是删除总是线性发生的,因为它是一个队列。 因此,删除过程将只重写下一个未删除行的文件偏移量。

我将文件的前8个字节保留为文件指针(其值等于或大于8)。 但这使文件变成二进制文件,不再是txt文件。 您可以将该偏移量写入同级文件中。

但是,由于这是一个队列,我不得不不时创建新文件并收集完全删除的文件。

否则,不能,您不能切掉文件部分。 每行必须具有自己的删除标志。 清理/打包/管理可用空间(或重写干净的版本)对于那里的每个数据库都是可悲的现实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM