将数据写入RandomAccessFile

时间:2013-03-16 16:58:48

标签: randomaccessfile

在我的项目中,我需要为每个学生创建一个文件,我想我已经创建了这个方法,现在它在下面

    public addStudent(String fullName, int grn, String formClass, String formTeacher)
    {
        //Default values
        int creativity = 0;
        int action = 0;
        int service = 0;
        int total = 0;

        //Initialize File
        RandomAccessFile adding     = new RandomAccessFile(new File(fullName + ".dat"), "rw");
        long fileSize = adding.length();
        adding.seek(fileSize);

        //Variables from Method
        adding.writeUTF(fullName + "\n");
        adding.writeInt(grn + "\n");
        adding.writeUTF(formClass  + "\n");
        adding.writeUTF(formTeacher  + "\n");

        //Variables created in method
        adding.writeInt(creativtiy + "\n");
        adding.writeInt(action + "\n");
        adding.writeInt(service + "\n");
        adding.writeInt(total + "\n");

        adding.close();
}

我只是一直认为它不对,并想对某些部分进行澄清,例如这一行

    RandomAccessFile adding     = new RandomAccessFile(new File(fullName + ".dat"), "rw");

fullname是传递给方法的变量,它是学生的姓名和姓氏(例如:John Lennon)。我想要做的是有一个名为“John Lennon.dat”的文件。但我一直认为我的做法是错误的。

另一个问题是关于整数值。它们会不时更新,但通过简单添加当前+新。我该怎么做?

1 个答案:

答案 0 :(得分:0)

  1. 如果您使用可能的用户输入(fullname)未命名用于命名文件,则必须小心。这可能导致安全漏洞。您应该检查fullname以查找文件系统中不允许的特殊字符或更改目录。想象一下有人可以输入../importantfile作为fullname而不检查是否可以覆盖其他目录中的一些重要文件。 最安全的方法是为您的文件使用一些通用名称架构(例如data1.datdata2.dat,并将关系fullname存储到另一个地方的文件名(可能是文件index.dat )。

  2. 我认为你有充分的理由在这里使用RandomAccessFile。根据您的代码,可以在一个文件中包含多个记录。如果您不将记录的起始位置存储在另一个位置,则必须读取一个接一个的记录。如果您发现要更改的记录,则必须在整数值之前读取所有字段,以便文件位置指向整数起始位置。然后,您可以读取整数,更改值,将文件位置移回4个字节(seek(-4))。然后你可以写出你修改过的整数值。

  3. 备选方案:

    • 您可以读取整个文件,修改整数值,然后创建整个文件new并覆盖旧文件。对于短文件,这可能不那么复杂,没有显着的性能损失(但这取决于,如果您在短时间内有数千个文件需要更改,则不建议使用此替代方法。)
    • 您可以将整数值的文件位置存储在其他位置,并使用这些位置直接访问这些值。这只适用于字符串不可变的情况。
    • 您可以使用其他文件格式,如XML,JSON或序列化对象。但所有这些都不支持原位变化。
    • 您可以使用SQLite或H2等嵌入式数据库,让数据库关注文件访问和索引。