使用RandomAccessFile删除记录

时间:2016-02-02 14:18:08

标签: java

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

我将文件的前8个字节保留为文件指针(其值为8或更高)。这使文件成为二进制文件,而不是txt。您可以在兄弟文件中编写该偏移量。

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

否则,你不能删除文件部分。每行必须有自己的删除标志。吸尘/包装/管理自由空间(或重写干净版本)对于每个数据库都是一个悲惨的现实。