Запись данных в 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.dat». однако я продолжаю думать, что мой подход здесь неверен.

Другой вопрос касается целочисленных значений. они будут обновляться время от времени, но простым добавлением текущего+нового. Как я могу это сделать?


person Vincent Frodont    schedule 16.03.2013    source источник


Ответы (1)


  1. Вы должны быть осторожны, если вы используете возможный пользовательский ввод (fullname) без фильтрации для именования ваших файлов. Это может привести к дыре в безопасности. Вы должны проверить fullname на наличие специальных символов, которые не разрешены в вашей файловой системе или изменили бы ваш каталог. Представьте, что кто-то может ввести ../importantfile как fullname и без проверки можно перезаписать некоторые важные файлы в других каталогах. Самый безопасный способ — использовать некоторую общую схему имен для ваших файлов (например, data1.dat, data2.dat и хранить отношение fullname к имени файла в другом месте (возможно, в файле index.dat).

  2. Я предполагаю, что у вас есть веская причина использовать здесь RandomAccessFile. Согласно вашему коду в одном файле может быть более одной записи. Если вы не сохраняете начальную позицию записи в другом месте, вам придется читать одну запись за другой. Если вы обнаружили, что ваша запись изменилась, вам нужно прочитать все поля перед вашим целочисленным значением, чтобы ваша позиция в файле указывала на начальную позицию целого числа. Затем вы можете прочитать свое целое число, изменить значение, переместить позицию файла на 4 байта назад (seek(-4)). Затем вы можете записать измененное целочисленное значение.

Альтернативы:

  • Вы можете прочитать весь файл, изменить целочисленные значения, а затем создать весь файл новым и перезаписать старый. Для коротких файлов это может быть менее сложно без значительного снижения производительности (но это зависит от того, если вам нужно изменить тысячи файлов за короткое время, этот вариант не рекомендуется).
  • Вы можете сохранить файловые позиции ваших целочисленных значений в другом месте и использовать их для прямого доступа к этим значениям. Это работает, только если ваши строки неизменяемы.
  • Вы можете использовать альтернативный формат файла, такой как XML, JSON или сериализованные объекты. Но все это не поддерживает изменения на месте.
  • Вы можете использовать встроенную базу данных, такую ​​как SQLite или H2, и позволить базе данных заботиться о доступе к файлам и индексации.
person vanje    schedule 16.03.2013