Java 使用RandomAccessFile删除记录

Java 使用RandomAccessFile删除记录,java,Java,我目前能够从.txt文件中删除记录的方法是将所有字符都设置为空,但不幸的是,它只是将这些单位设置为空,并且不会删除这些单位。你知道我怎样才能从我的txt文件中完全删除一行记录,而不重新编写整个文件吗 protected boolean DeleteObject(int mID) { try { file = new RandomAccessFile(new File("UserDB.txt"), "rw"); long FileSize = file.le

我目前能够从.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;
}
受保护的布尔删除对象(int-mID)
{
试一试{
file=new RandomAccessFile(新文件(“UserDB.txt”),“rw”);
long FileSize=file.length();
查找文件(0);
long NUMRecords=文件大小/记录;
对于(int j=0;j对于(inti=0;i,您可以将文件设计为包含逻辑删除标志。

删除记录时,您将更新逻辑删除标志,将记录标记为已删除,而不是从文件中实际删除它。

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

我曾经将一个文件用作队列。其概念是,由于它是一个队列,所以删除操作总是线性进行。因此,删除过程将只重写下一个非de的文件偏移量删除行

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

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


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

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

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

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


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

在主要平台上不支持截断文件的中间部分,这意味着,即使java有这样做的方法,它仍然需要重写文件的部分。更难的是原子化地执行此操作。@Ferrybig在哪些平台上支持此操作?截断文件的中间部分文件在主要平台上不受支持,这意味着,即使java有这样做的方法,它仍然需要重写文件的一部分。更困难的是以原子方式执行此操作。@Ferrybig在哪些平台上支持此操作?“我曾经打算将一个文件用作队列。其概念是,由于它是一个队列,所以删除操作总是线性进行。因此,删除过程只需重写下一个未删除行的文件偏移量。“这将是一个好主意,我如何将下一行重写为我要删除的项目?通过这种方式,我们可以将所有内容向上移动,然后使用setLength()减小txt文件的大小。”函数。哦,你不会想这样做的。这意味着基本上与重写整个文件减去一条记录相同。如果你有固定长度的记录,那就是另一个游戏:你可以轻松地将这个文件当作鼓,上面说的指针是头,你也会有一个尾指针,并在尾处写入文件。但既然你e不清楚db.txt的用途(是否排队),这可能会导致其他复杂问题。无序删除会将文件变成一个很大程度上分散的blob,您必须为其管理删除的空间…仅供参考,您的问题看起来与电子邮件文件夹相同。如在Thunderbird中。“压缩文件夹”应该最终被调用以打包和删除所有已删除的电子邮件。“我曾经有一个文件打算用作队列。其概念是,由于它是一个队列,所以删除总是线性进行。因此删除过程只会重写下一个未删除行的文件偏移量。”这将是一个好主意,我如何将下一行重写为我要删除的项?通过这种方式,我们可以将所有内容向上移动,然后使用setLength()减小txt文件的大小函数。哦,你不会想这样做的。这意味着基本上与重写整个文件减去一条记录相同。如果你有固定长度的记录,那就是另一个游戏:你可以轻松地将这个文件当作鼓,上面说的指针是头,你也会有一个尾指针,并在尾处写入文件。但既然你e不清楚db.txt的用途(是否排队),这可能会导致其他复杂问题。无序删除会将文件变成一个很大程度上分散的blob,您必须为其管理删除的空间…仅供参考,您的问题看起来与电子邮件文件夹相同。如在Thunderbird中。“压缩文件夹”应最终调用以打包和删除所有已删除的电子邮件。