Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Платформа Java - шаблоны, технологии, хитрости


выпуск 3

...

Практически любое приложение требует сохранения на диск некоторой информации. Настройки, время первого запуска и многое другое. Всё, для чего самому использовать файлы и базы данных не нужно (да и просто не хочется). Но решение есть.

Сохранение настроек приложения. Использование класса Preferences.

Очень часто необходимо сохранить настройки приложения или просто немного информации. Предположим, например, что необходимо сохранить информацию о дате первого использованию продукта, чтобы отсчитать 30 дней. Использовать для этого файл – это плохой вариант. О реестре Windows мы не говорим, т.к. во-первых, это некрасиво, а во-вторых, не переносимо на другие платформы.

Когда мне впервые потребовалось записать данные, я хотел, чтобы это выглядело примерно как setProperty (String, Object), getProperty (String). Оказалось, что такая функциональность в Java есть.

Класс java.util.prefs.Preferences

Этот класс специально создан для хранения пользовательской информации о настройках программы и т.п. Как Java хранит всю эту информацию не важно, на работу с этим классом это не влияет. Хотя в документации сказано, что данные могут храниться в виде базы данных, в виде файлов и другими способами.

Для использования этого класса нужно знать следующее:

Для хранения данных используется 2 независимых дерева: user и system tree. Значения терминов user и system для различных платформ различны. Предполагается, что в system хранится общая информация о приложении (дата регистрации), а в user настройки индивидуальные для каждого пользователя системы (шрифты, цвета).

И ещё необходимо знать два метода:

userNodeForPackage (Class c), systemNodeForPackage (Class c). Эти методы возвращают соответственно узел user дерева или system дерева ассоциируемый с классом c.

Рассмотрим использование класса Preferences на примере. Класс, который мы напишем, будет при первом запуске записывать дату. При последующих запусках он эту дату будет читать, и проверять, не прошло ли 30 дней.

        
class TrialPeriod
{
 //Настройки (системные, т.к. trial период один для всех пользователей)
 private static Preferences p = Preferences.systemNodeForPackage (TrialPeriod.class);
 
 //Записать текущую дату
 private static void putDate ()
 {
  p.putLong ("startDate", Calendar.getInstance ().getTimeInMillis()); 
 }

 //Считать записанную дату. 0 – значение по умолчанию, в нашем случае – это индикатор того,
 //дата не была записана и программа запускается первый раз
 private static long getDate ()
 {
     p.getLong ("startDate", 0); 
 }

 public static void main (String[] args)
 {
  //Кол-во миллисекунд в часе, дне, в 30 днях.
  //Написать trialTime = 30 * 24 * 60 * 60 * 1000 нельзя, т.к. вычисление с константами – 
  //это не long, результат не влезет, и мы получим отрицательный trialTime

  long millisInHour = 1000 * 60 * 60;
  long millisInDay = millisInHour * 24;
  long trialTime = 30 * millisInDay; 

  long start = getDate ();

  //0 – запускаем первый раз
  if (start == 0)
  {
   putDate ();
  }

  //Уже запускали
  else
  {
   //Прошло времени с первого старта
   long dif = Calendar. getInstance ().getTimeInMillis()) – start;
  
   if (dif >= trialTime)
   {
    System.out.println ("30 дней прошли");
   }
   else
   {
    //do something
   }
  }
 }
}

Естественно, что присутствуют методы не только для long, но и для остальных примитивных типов.

Все-таки не стоит хранить огромные тексты таким вот способом, никто не гарантирует вам скорость работы в этом случае. Честно говоря, мне неизвестно, будет ли это вообще работать. Но для хранения настроек или некоторой вспомогательной информации – это, возможно, лучший вариант.

2006

В избранное