0

在我的项目中,我需要为每个学生创建一个文件,我认为我已经创建了方法,如下所示

    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”的文件。但是我一直认为我在这里的方法是错误的。

另一个问题是关于整数值。它们会不时更新,但只需简单地添加 current+new。我怎么做?

4

1 回答 1

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

  2. 我认为您有充分的理由在RandomAccessFile这里使用 a 。根据您的代码,一个文件中可能有多个记录。如果您没有将记录的起始位置存储在另一个位置,那么您必须读取一条又一条记录。如果您发现您的记录要更改,那么您必须读取整数值之前的所有字段,以便您的文件位置指向整数开始位置。然后您可以读取整数,更改值,将文件位置向后移动 4 个字节(seek(-4))。然后您可以编写修改后的整数值。

备择方案:

  • 您可以读取整个文件,修改整数值,然后创建新的整个文件并覆盖旧文件。对于短文件,这可能不那么复杂而不会显着降低性能(但这取决于,如果您有数千个文件要在短时间内更改,则不建议使用此替代方案)。
  • 您可以将整数值的文件位置存储在另一个位置,并使用它们直接访问这些值。这仅在您的字符串不可变时才有效。
  • 您可以使用其他文件格式,如 XML、JSON 或序列化对象。但所有这些都不支持原位更改。
  • 您可以使用 SQLite 或 H2 等嵌入式数据库,让数据库关心文件访问和索引。
于 2013-03-16T18:12:01.873 回答