Добавил:
ИВТ (советую зайти в "Несортированное")rnПИН МАГА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
подгон 2018 (легендарный) / 3 курс -20241122T221211Z-001 / Java / Лабораторные / Основы Java. Лабораторная 4. Новая 1510.doc
Скачиваний:
2
Добавлен:
23.11.2024
Размер:
456.19 Кб
Скачать

Приложение 1. Работа с датой и временем в Java

Работа с датой и временем достаточно трудоемка по сравнению с числовыми типами данных. В месяцах разное количество дней, которое зависит еще и от года. Месяцы и дни недели имеют разные названия, поэтому языкозависимы. Разнообразие форматов записи даты гораздо большее, чем у чисел. Поэтому реализация работы с датой в Java естественным образом реализована с помощью объектов. Удобная работа с датой и временем в составе пакета java.time появилась в Java SE 8.

API java.time содержит 5 пакетов:

  1. java.time — базовый пакет, содержащий объекты для хранения значений

  2. java.time.chrono — предоставляет доступ к разным календарям

  3. java.time.format — форматирование и распознание даты и времени

  4. java.time.temporal — низкоуровневые библиотеки и расширенный функционал

  5. java.time.zone — классы для работы с часовыми поясами

Пример. Вывод текущего времени

import java.time.*;

...

LocalTime time = LocalTime.now();

System.out.println(time.getHour()+":"+time.getMinute()+":"+time.getSecond());

// 18:29:3

System.out.println(time.format(DateTimeFormatter.ofPattern("H:mm:ss")));

// 18:29:03 // Использование форматирования

Пример. Манипуляции с датой: получение текущей, создание новой, проверки

LocalDate today = LocalDate.now();

LocalDate ntoday = today.plusDays(20);

if( today.isBefore(ntoday) ) {

Period period = today.until(ntoday);

System.out.println("Дней между today и ntoday : "+period.getDays()); // 20

}

//Получаем год, проверям его на высокосность

System.out.println(today.getYear()+" - высокосный? "+today.isLeapYear()); // TRUE

Помимо нового пакета java.time можно пользоваться и устаревшим пакетом java.util.Date.

Для получения значения миллисекунд и наносекунд можно использовать:

System.currentTimeMillis()

System.nanoTime()

Приложение 2. Пример общего класса обработки ошибок, сообщений и логирования.

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

Пример класса ErrMsgLog

package controller;

import java.io.IOException;

import java.util.ArrayList;

import java.util.logging.Level;

import java.util.logging.LogManager;

import java.util.logging.Logger;

import java.util.logging.FileHandler;

import java.util.logging.SimpleFormatter;

/**

*

* @author Андрей

*/

public class ErrMsgLog {

private static ArrayList <Exception> ErrList;

private static Logger log;

//private static FileHandler errhnd;

public ErrMsgLog() throws IOException {

ErrList = new ArrayList();

//Читаем конфигурационный файл лога

LogManager.getLogManager().readConfiguration(ErrMsgLog.class.getResourceAsStream("logging.properties"));

log = Logger.getLogger(ErrMsgLog.class.getName());

//Закомментарили т.к. вынесли в конфигурационный файл лога

//errhnd = new FileHandler("src/logs/err_log.txt", true);

//errhnd.setFormatter( new SimpleFormatter());

//log.addHandler(errhnd);

}

//Добавляем ошибку в список ошибок

public int addErr(Exception e) {

ErrList.add(e);

return ErrList.size();

}

//Добавляем ошибку в список ошибок и в лог

public int addErrWithLog(Exception e) {

ErrList.add(e);

//Код записи сообщения в лог

log.log(Level.FINE, e.getMessage());

return ErrList.size();

}

//Получаем количество ошибок

public int getErrCount() {

return ErrList.size();

}

//Выводим информацию об ошибке

public void showErrText(Exception e) {

System.err.println(e.getMessage());

}

//Генерим (пробрасываем ошибку) с фиксацией в списке ошибок

public Exception makeErr(Exception e) {

addErr(e);

return new Exception(e);

}

}

Пример конф. файла logging.properties, лежащего в одном пакете с ErrMsgLog

.level=FINE

java.util.logging.ConsoleHandler.level = FINE

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

handlers = java.util.logging.FileHandler

#Путь к папке и файлу запсиси лога. При нескольких файлах имя будет иметь вид err_log.txt.n, где n - число

java.util.logging.FileHandler.pattern = src/logs/err_log.txt

#количество байт в файле лога

java.util.logging.FileHandler.limit = 100000

#количество файлов лога

java.util.logging.FileHandler.count = 3

#дописываем в конец файла лога ошибки

java.util.logging.FileHandler.append = true

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

#Настраиваем формат вывода

#format 0, date 1, source 2, logger 3, level 4, message 5, thrown 6);

#%1$tF %1 - взять дату из строки, $ - применить форматир-е, t - время, F - дата в формате ISO8601: YYYY-MM-DD

java.util.logging.SimpleFormatter.format = %1$tF %1$tT %4$-5s %5$s %n

Полный список настроек логера, которые можно использовать в logging.properties можно посмотреть по адресу — http://tutorials.jenkov.com/java-logging/configuration.html.

Список опций форматирования можно посмотреть по адресу - http://pr0java.blogspot.com/2015/06/8.html.

Далее в классе с которого стартует прогграмма создаем объект нашего общего обработчика

myerr = new ErrMsgLog();

Передаем его в контроллер

controller = new Main(model, view, prop, myerr);

И далее можно ошибки обрабатывать с помощью этого класса.

Пример. Обработка ошибки.

try{

//Какой-то код

} catch (Exception e) {

myerr.addErrWithLog(e); //Добавляем ошибку в список и пишем в лог без отображения в консоли

myerr.showErrText(e); //Отображаем ошибку

}

Пример. Проброс ошибки на вышестоящий уровень с фиксацией в списке ошибок

//В каком-то классе внутри иерархии

try{

//Какой-то код

} catch (NumberFormatException e) {

//Ошибка будет добавлена в список ошибок и затем «поднята» выше по иерархии

throw myerr.makeErr(new Exception("Введен неверный номер пункта меню"));

}