SlideShare une entreprise Scribd logo
1  sur  59
Télécharger pour lire hors ligne
Углубленное 
программирование на 
Java 
Лекция 2.3 
«Инструменты» 
Виталий Чибриков
План лекции 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System 
2
Random 
Нет понятия случайного числа 
Есть последовательности чисел с заданным распределением 
Pseudorandom number generator — алгоритм, порождающий 
последовательность чисел, элементы которой почти 
независимы друг от друга и подчиняются заданному распределению 
3
Алгоритм случайности 
4 
java.util.Random 
Linear Congruential Pseudorandom Number Generator (See Donald 
Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.) 
modulus 
multiplier 
increment 
seed
Параметры случайности 
5 
Source m (multiplier) a (increment) c 
Borland C/C++ 232 22695477 1 
glibc (used by GCC) 231 1103515245 12345 
Borland Delphi, Virtual Pascal 232 134775813 1 
Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316) 
Microsoft Visual Basic (6 and earlier) 224 1140671485 
(43FD43FD16) 
12820163 (C39EC316) 
C++11 231 − 1 16807 0 
C++11's minstd_rand[9] 231 − 1 48271 0 
MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407 
Java's java.util.Random, 248 25214903917 11
Random in java 
Random rnd = new Random(); 
rnd.nextInt(100); – вернет случайное число от 0 до 99 
При каждом запуске последовательность будет новой 
Random rnd = new Random(1L); 
rnd.nextInt(100); – вернет случайное число от 0 до 99 
При каждом запуске последовательность будет прежней 
Math.random(); – вернет случайное число типа double 
от 0 до 1 
При каждом запуске последовательность будет новой 
6
Субъективная случайность 
…Sid Meier found that if a player lost too many 2-to-1 battles in a 
row, they would get frustrated. Instead of risking a player shutting 
the game down, Sid changed the math :o) 
7 
Видео (Sid Meier GDC 2010): 
http://www.youtube.com/watch?v=bY7aRJE-oOY
План лекции 
8 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
Time & Date 
9 
Работа со временем 
От миллисекунд до даты 
UNIX или POSIX time – время с 1 января 1970 в секундах 
Форматирование даты и времени для пользователей 
Как хранить время в приложении и в базе 
Подписка на таймер 
Работу со временем лучше перенести в TimeHelper
TimeHelper 
10 
public class TimeHelper { 
public static long getTimeInMs(){ 
Date date = new Date(); 
return date.getTime(); 
} 
public static int getPOSIX(){ 
Date date = new Date(); 
int millisInSecond = 1000; 
return (int)(date.getTime() / millisInSecond); 
} 
public static String getUserDateFull(Locale locale){ 
Date date = new Date(); 
DateFormat dateFormatter = 
DateFormat. getDateInstance(DateFormat.FULL, locale); 
return dateFormatter.format(date); 
} 
}
Timer 
11 
java.unil.Timer 
java.unil.TimerTask 
Порядок работы: 
Создаем timer 
Создаем класс унаследованный от TimerTask 
Пишем в методе run() код, который будет выполнен по таймеру 
Передаем в timer таск и время, через которое надо выполнить таск 
Ждем положенное время 
PROFIT!!! 
Выключаем timer через timer.cancel();
Timer 
12 
int timeMs = 10000; 
TimeService.instance().start(); 
TimeService.instance().sheduleTask(new TimerTask(){ 
public void run() { 
System.out.append("Timer run!n"); 
TimeService.instance().stop(); 
} 
}, timeMs);
План лекции 
13 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
I/O, потоки 
I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.) 
Поток ― объект который представляет источник или приемник данных 
Поток основан на последовательности битов данных 
14 
InputStream 
OutputStream
InputStream 
public abstract class InputStream 
Основные методы: 
abstract int read() 
int read(byte[] b) 
void mark(int readlimit) 
void reset() 
void close() 
Основная задача ― читать байт за байтом из входного потока 
15
Byte Streams 
16 
OutputStream 
InputStream 
PrintStream 
FileOutputStream 
FilterOutputStream BufferedOutputStream 
DataOutputStream 
FileInputStream 
FilterInputStream 
BufferedInputStream 
DataInputStream
FilterInputStream 
Decorator pattern 
Переопределяет все методы InputStream вызывая методы поля in 
Наследники этого класса могут менять работу потока в поле in 
17 
public class FilterInputStream extends InputStream 
private InputStream in; 
protected FilterInputStream(InputStream in){ 
this.in = in; 
}
Decorator 
18
Decorator 
Рассмотрим сериализованные java объекты, которые лежат в gzip архиве 
и которые мы хотим быстро прочесть. 
19 
Для начала откроем inputstream для файла: 
FileInputStream fis = new FileInputStream("/objects.gz"); 
Читать побитово для нас слишком долго -- буферизуем чтение: 
BufferedInputStream bis = new BufferedInputStream(fis); 
Файл зазипован -- нам надо его разархивировать: 
GzipInputStream gis = new GzipInputStream(bis); 
Теперь десиериализуем java объекты: 
ObjectInputStream ois = new ObjectInputStream(gis); 
И, наконец, прочитаем: 
SomeObject someObject = (SomeObject) ois.readObject();
Character Streams 
20 
FileWriter 
FileReader 
Writer 
Reader 
BufferedWriter 
OutputStreamWriter 
PrintWriter 
BufferedReader 
InputStreamReader
Закрытие потоков 
Для особождения ресурсов все потоки должны быть закрыты 
BufferedReader br = null; 
try{ 
//code 
br = new BufferedReader(isr); 
//code 
} catch (Exception e){ 
System.err.println("Error: " + e.getMessage()); 
} finally { 
if(br != null){ 
try { 
br.close(); 
} catch (IOException e) { 
System.err.println("Error: " + e.getMessage()); 
} 
} 
} 
21
План лекции 
22 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
Сериализация 
Перевод объекта в формат данных удобный для хранения и передачи 
Процесс должен быть обратимым 
23 
Объект Метаданные
Сериализация 
Примеры сериализации 
24 
Запись в бинарный файл 
Запись в xml файл 
Запись в json string 
Запись blob в базу данных 
Пересылка по сети между 
процессами 
Описание объекта в стихах и пересылка почтовым голубем
interface Serializable 
25 
Обьект класса реализующего интерфейс Serializable можно 
сериализовать 
Результат сериализации ― массив байт 
Обычно объекты сериализуют в файл, в blob или в сетевой поток 
Процесс сериализации: 
Создание потока представляющего направление сериализации 
Создание ObjectOutputStream для этого потока
Что будет сериализовано 
26 
Все поля сериализуемого объекта должны быть Serializable 
Все поля будут сериализованы 
Поля родительских классов реализующих Serializable 
будут сериализованы 
Если родительский класс НЕ реализует Serializable, 
то при десериализации для него будет вызван конструктор 
по-умолчанию
Что НЕ будет сериализовано 
27 
Поле которое не надо сериализовать нужно пометить как transient 
private transient long time; 
Статические поля сериализваны НЕ будут 
При десериализации static и transient поля будут заполнены 
значениями по-умолчанию
Serialization Object 
28 
public class SerializationObject implements Serializable { 
private String name; // name = Zoe 
private int age; // age = 31 
… 
}
Запись в файл 
SerializationObject object = new SerializationObject("Zoe", 
31); 
FileOutputStream fileOut = new FileOutputStream("test.bin"); 
ObjectOutputStream out = new ObjectOutputStream(fileOut); 
out.writeObject(object); 
out.close(); 
29
Десериализация 
30 
Чтение происходит в обратном порядке 
родительские классы 
классы переменных родительских классов 
объекты родительских классов 
значения переменных родительских классов 
классы переменных 
значения переменных
План лекции 
31 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
Reflection 
Возможность проверить структуру объекта в runtime 
Возможность изменить поведение объекта в runtime 
32 
Сериализация 
Serializable – пустой интерфейс 
Мы не написали ни строчки кода для сериализации объекта 
Reflection разбирает объект и переводит его в массив байт
Используя Reflection можно 
33 
Получить список переменных класса 
Получить список методов класса 
Получить список конструкторов класса 
Создать объект, вызвав его конструктор 
Вызвать метод 
Поменять область видимости переменной или метода
Минусы Reflection 
34 
Если задачу можно решить без reflection ― 
ее лучше решить без reflection 
Потеря производительности 
Не работает в окружении с повышенной безопасностью (applet-ы) 
Разрушение ОО архитектуры
java.lang.Class 
Основные методы класса Class 
static Class<T> forName(String className) 
String getCanonicalName() 
Fields[] getField(String name) 
Class[] getInterfaces() 
Method[] getMethods() 
Constructor[] getConstructors() 
35 
― объект, который представляет в runtime данные Class о классе объекта
java.lang.Class 
Как получить Class<?> объект 
Class<?> clazz = object.getClass() 
Class<?> clazz = className.class //в том числе для простых типов 
Class<?> clazz = Class.forName(“java.io.Serializable”) 
Class[] clases = clazz.getInterfaces() 
36
java.lang.reflect.Member 
37 
java.lang.reflect.Member – интерфейс членов класса 
Классы реализующие интерфейс Member 
Field 
Method 
Constructor
ReflectionHelper 
38 
public static Object createIntance(String className){ 
try { 
return 
Class.forName(className).newInstance(); 
} catch (…){…} 
}
ReflectionHelper 
39 
public static void setFieldValue(Object object, String fieldName, String 
value){ 
try { 
Field field = 
object.getClass().getDeclaredField(fieldName); 
field.setAccessible(true); 
if(field.getType().equals(String.class)){ 
field.set(object, value); 
} else if ( field.getType().equals(int.class)){ 
field.set(object, Integer.decode(value)); 
} 
field.setAccessible(false); 
} catch(…){…} 
}
План лекции 
40 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
XML Serialization 
41 
Данные объекта ― иерархически упорядоченные поля 
простых типов 
XML документ ― иерархически упорядоченные тэги со строками 
Имя переменной ― имя тэга 
Значение переменной ― строковое значение тэга
Отличия XML 
42 
Занчительно проще редактировать 
Значительно проще версионировать 
Нет привязки к типу 
Нет привязки к особенностям языка 
Избыточна 
Медленное чтение и запись
SAX parser 
Simple API for XML (SAX) 
Стандартное средство обработки XML документов 
43 
Обходит XML дерево 
Посещает каждую ноду дерева 
Для каждой ноды вызывает 3 callback-а
SAX parser 
44 
Порядок работы: 
Читаем формат документа 
Читаем первый тэг ― сообщаем приложению, что обработка начата 
Читаем содержимое тэга 
Сообщаем приложению содержимое тэга 
Рекурсивно обращаемся ко всем вложенным тэгам 
Сообщаем приложению, что обработка завершена
SAX parser методы 
45 
org.xml.sax.helpers.DefaultHandle 
r 
Методы для обработки тегов во время обхода документа: 
startDocument() 
startElement(…) 
characters(…) 
endElement(…) 
endDocument() 
Обход дерева
Десериализация XML 
46 
Задача: 
Разработать XML формат для документа так чтобы 
Можно было понять класс десериализуемого объекта 
Тэг с именем переменной содержал 
Атрибуты для восстановления переменной 
Значение переменной 
Записать ресурсы игры в выбранном формате
Простой XML документ 
47 
<class type=“main.SerializationObject”> 
<name>Zully</name> 
<age>23</age> 
</class> 
Порядок обработки SAX парсером: 
startDocument 
startElement class 
startElement name 
endElement name 
startElement age 
endElement age 
endElement class 
endDocument
Handler 
public class SaxEmptyHandler extends DefaultHandler { 
private static String CLASSNAME = "class"; 
private Object object; 
private String element; 
public void startElement(String uri, String localName, String qName, Attributes 
attributes) { 
… 
} 
public void endElement(String uri, String localName, String qName) { 
... 
} 
public void characters(char ch[], int start, int length) { 
… 
} 
} 
48
Используем Reflection 
public void startElement(String uri, String localName, String qName, Attributes attributes) { 
if(qName != CLASSNAME){ 
element = qName; 
} 
else { 
String className = attributes.getValue(0); 
System.out.println("Class name: " + className); 
object = ReflectionHelper.createIntance(className); 
} 
} 
public void endElement(String uri, String localName, String qName) { 
element = null; 
} 
public void characters(char ch[], int start, int length) { 
if(element != null){ 
String value = new String(ch, start, length); 
System.out.println(element + " = " + value); 
ReflectionHelper.setFieldValue(object, element, value); 
} 
} 
49
DOM parser 
50 
Document Object Model 
Сначала прочитаем весь XML, потом обойдем все ноды 
javax.xml.parsers.DocumentBuilderFactory 
javax.xml.parsers.DocumentBuilder 
org.w3c.dom.Document 
File fXmlFile = new File(“test.xml”); 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile);
SAX & DOM сравнение 
51 
SAX parser DOM parser 
SAX (Simple API for XML) парсер не создает никакой 
внутренней структуры. Вместо этого, он берет все 
вхождения компонентов во входящем документе в виде 
событий (events) и говорит клиенту что он читает, 
поскольку он читает через входящий документ. 
DOM (Document Object Model) парсер создает древовидную 
структуру в памяти из входящего документа и лишь потом 
ждет запросов от клиента. 
SAX парсер всегда отдает клиенту лишь куски документа. Всегда отдает клиенту целый документ, независимо от 
того, сколько в действительности необходимо 
пользователю. 
Менее требователен к ресурсам и занимаемому 
свободному месту в случае использования больших 
входящих документов (потому что он не создает 
внутренней структуры). Также он запускается быстрее и 
более легок в изучении, чем DOM парсер. 
Имеет богатый функционал. Создает DOM-дерево в памяти 
и позволяет доступаться к любой части документа, а также 
модифицировать его. Но он не рационально распоряжается 
свободным местом в случае использования огромных 
документов. 
Используйте в следующих случаях: 
▪ Входящий документ слишком велик для доступной 
памяти 
▪ Когда необходимо прочитать лишь небольшой 
участок документа. 
▪ Используя SAX, вы используете меньшее количество 
памяти и производите меньше динамических 
резерваций памяти. 
Используйте в следующих случаях: 
▪ Вашему приложению необходимо иметь доступ к 
различным частям документа и использование 
собственной структуры столь же сложно, как и 
использование дерева DOM. 
▪ Вашему приложению необходимо изменять дерево 
очень часто и данные должны быть сохранены на 
определенный период времени.
План лекции 
52 
1. Random 
2. Time и Date 
3. I/O streams 
4. Serialization 
5. Reflection 
6. SAX & DOM 
7. Resource System
Resource 
53 
― интерфейс для всех объектов со статическими данными 
Resource 
Конкретный ресурс можно собрать на основе XML документа 
Ресурс одного типа может быть описан несколькими 
XML документами 
Уникальность игрового ресурса ― путь к его XML файлу 
XML документы для ресурсов создают дизайнеры 
Все параметры игры должны быть в ресурсах
Resource Systen 
54 
Ресурсная система 
XML файлы с описанием игровых объектов 
Инструменты для редактирования XML файлов 
Инструменты для создания игровых объектов по ресурсам
Resource Systen 
55 
В Allods Online 
3 года разработки 
> 200 000 ресурсов 
Загрузка всех ресурсов примерно 30 минут 
На разработке ресурсной системы 2 программиста 
На разработке редакторов 3 программиста 
Ресурсы создавали > 10 дизайнеров
ResourceFactory 
56 
ResourceFactory – фабрика ресурсов 
Возвращает объект ресурса по пути к XML файлу
ДЗ 
57 
Вынести все параметры в XML файлы 
Создать interface Resource и class GMResource 
Создать class ResourceFactory (singleton) 
GMResource resource = 
(GMResource) ResourceFactory.instance().get(“./data/GMConfig.xml”)
ResourceSystem * 
58 
Загрузка всех ресурсов при старте сервера 
Используем VFS.instance().getIterator(“./data”) 
Все ресурсы храним в директории ./data 
Обходим все файлы и создаем все ресурсы 
Ресурсы храним в Map<String, Resource>
Спасибо за внимание 
Виталий Чибриков 
chibrikov@corp.mail.ru

Contenu connexe

Tendances

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classesMERA_school
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 

Tendances (18)

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
JRebel
JRebelJRebel
JRebel
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 

En vedette

Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"Technopark
 

En vedette (19)

Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
 

Similaire à Java осень 2014 занятие 6

Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7Technopark
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLRMikhail Shcherbakov
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++corehard_by
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаSQALab
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 

Similaire à Java осень 2014 занятие 6 (20)

Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщикаИнструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 

Plus de Technopark

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 

Plus de Technopark (7)

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

Java осень 2014 занятие 6

  • 1. Углубленное программирование на Java Лекция 2.3 «Инструменты» Виталий Чибриков
  • 2. План лекции 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System 2
  • 3. Random Нет понятия случайного числа Есть последовательности чисел с заданным распределением Pseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению 3
  • 4. Алгоритм случайности 4 java.util.Random Linear Congruential Pseudorandom Number Generator (See Donald Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.) modulus multiplier increment seed
  • 5. Параметры случайности 5 Source m (multiplier) a (increment) c Borland C/C++ 232 22695477 1 glibc (used by GCC) 231 1103515245 12345 Borland Delphi, Virtual Pascal 232 134775813 1 Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316) Microsoft Visual Basic (6 and earlier) 224 1140671485 (43FD43FD16) 12820163 (C39EC316) C++11 231 − 1 16807 0 C++11's minstd_rand[9] 231 − 1 48271 0 MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407 Java's java.util.Random, 248 25214903917 11
  • 6. Random in java Random rnd = new Random(); rnd.nextInt(100); – вернет случайное число от 0 до 99 При каждом запуске последовательность будет новой Random rnd = new Random(1L); rnd.nextInt(100); – вернет случайное число от 0 до 99 При каждом запуске последовательность будет прежней Math.random(); – вернет случайное число типа double от 0 до 1 При каждом запуске последовательность будет новой 6
  • 7. Субъективная случайность …Sid Meier found that if a player lost too many 2-to-1 battles in a row, they would get frustrated. Instead of risking a player shutting the game down, Sid changed the math :o) 7 Видео (Sid Meier GDC 2010): http://www.youtube.com/watch?v=bY7aRJE-oOY
  • 8. План лекции 8 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 9. Time & Date 9 Работа со временем От миллисекунд до даты UNIX или POSIX time – время с 1 января 1970 в секундах Форматирование даты и времени для пользователей Как хранить время в приложении и в базе Подписка на таймер Работу со временем лучше перенести в TimeHelper
  • 10. TimeHelper 10 public class TimeHelper { public static long getTimeInMs(){ Date date = new Date(); return date.getTime(); } public static int getPOSIX(){ Date date = new Date(); int millisInSecond = 1000; return (int)(date.getTime() / millisInSecond); } public static String getUserDateFull(Locale locale){ Date date = new Date(); DateFormat dateFormatter = DateFormat. getDateInstance(DateFormat.FULL, locale); return dateFormatter.format(date); } }
  • 11. Timer 11 java.unil.Timer java.unil.TimerTask Порядок работы: Создаем timer Создаем класс унаследованный от TimerTask Пишем в методе run() код, который будет выполнен по таймеру Передаем в timer таск и время, через которое надо выполнить таск Ждем положенное время PROFIT!!! Выключаем timer через timer.cancel();
  • 12. Timer 12 int timeMs = 10000; TimeService.instance().start(); TimeService.instance().sheduleTask(new TimerTask(){ public void run() { System.out.append("Timer run!n"); TimeService.instance().stop(); } }, timeMs);
  • 13. План лекции 13 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 14. I/O, потоки I/O ― общение с внешними устройствами (файлы, принтеры, сеть и т.д.) Поток ― объект который представляет источник или приемник данных Поток основан на последовательности битов данных 14 InputStream OutputStream
  • 15. InputStream public abstract class InputStream Основные методы: abstract int read() int read(byte[] b) void mark(int readlimit) void reset() void close() Основная задача ― читать байт за байтом из входного потока 15
  • 16. Byte Streams 16 OutputStream InputStream PrintStream FileOutputStream FilterOutputStream BufferedOutputStream DataOutputStream FileInputStream FilterInputStream BufferedInputStream DataInputStream
  • 17. FilterInputStream Decorator pattern Переопределяет все методы InputStream вызывая методы поля in Наследники этого класса могут менять работу потока в поле in 17 public class FilterInputStream extends InputStream private InputStream in; protected FilterInputStream(InputStream in){ this.in = in; }
  • 19. Decorator Рассмотрим сериализованные java объекты, которые лежат в gzip архиве и которые мы хотим быстро прочесть. 19 Для начала откроем inputstream для файла: FileInputStream fis = new FileInputStream("/objects.gz"); Читать побитово для нас слишком долго -- буферизуем чтение: BufferedInputStream bis = new BufferedInputStream(fis); Файл зазипован -- нам надо его разархивировать: GzipInputStream gis = new GzipInputStream(bis); Теперь десиериализуем java объекты: ObjectInputStream ois = new ObjectInputStream(gis); И, наконец, прочитаем: SomeObject someObject = (SomeObject) ois.readObject();
  • 20. Character Streams 20 FileWriter FileReader Writer Reader BufferedWriter OutputStreamWriter PrintWriter BufferedReader InputStreamReader
  • 21. Закрытие потоков Для особождения ресурсов все потоки должны быть закрыты BufferedReader br = null; try{ //code br = new BufferedReader(isr); //code } catch (Exception e){ System.err.println("Error: " + e.getMessage()); } finally { if(br != null){ try { br.close(); } catch (IOException e) { System.err.println("Error: " + e.getMessage()); } } } 21
  • 22. План лекции 22 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 23. Сериализация Перевод объекта в формат данных удобный для хранения и передачи Процесс должен быть обратимым 23 Объект Метаданные
  • 24. Сериализация Примеры сериализации 24 Запись в бинарный файл Запись в xml файл Запись в json string Запись blob в базу данных Пересылка по сети между процессами Описание объекта в стихах и пересылка почтовым голубем
  • 25. interface Serializable 25 Обьект класса реализующего интерфейс Serializable можно сериализовать Результат сериализации ― массив байт Обычно объекты сериализуют в файл, в blob или в сетевой поток Процесс сериализации: Создание потока представляющего направление сериализации Создание ObjectOutputStream для этого потока
  • 26. Что будет сериализовано 26 Все поля сериализуемого объекта должны быть Serializable Все поля будут сериализованы Поля родительских классов реализующих Serializable будут сериализованы Если родительский класс НЕ реализует Serializable, то при десериализации для него будет вызван конструктор по-умолчанию
  • 27. Что НЕ будет сериализовано 27 Поле которое не надо сериализовать нужно пометить как transient private transient long time; Статические поля сериализваны НЕ будут При десериализации static и transient поля будут заполнены значениями по-умолчанию
  • 28. Serialization Object 28 public class SerializationObject implements Serializable { private String name; // name = Zoe private int age; // age = 31 … }
  • 29. Запись в файл SerializationObject object = new SerializationObject("Zoe", 31); FileOutputStream fileOut = new FileOutputStream("test.bin"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(object); out.close(); 29
  • 30. Десериализация 30 Чтение происходит в обратном порядке родительские классы классы переменных родительских классов объекты родительских классов значения переменных родительских классов классы переменных значения переменных
  • 31. План лекции 31 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 32. Reflection Возможность проверить структуру объекта в runtime Возможность изменить поведение объекта в runtime 32 Сериализация Serializable – пустой интерфейс Мы не написали ни строчки кода для сериализации объекта Reflection разбирает объект и переводит его в массив байт
  • 33. Используя Reflection можно 33 Получить список переменных класса Получить список методов класса Получить список конструкторов класса Создать объект, вызвав его конструктор Вызвать метод Поменять область видимости переменной или метода
  • 34. Минусы Reflection 34 Если задачу можно решить без reflection ― ее лучше решить без reflection Потеря производительности Не работает в окружении с повышенной безопасностью (applet-ы) Разрушение ОО архитектуры
  • 35. java.lang.Class Основные методы класса Class static Class<T> forName(String className) String getCanonicalName() Fields[] getField(String name) Class[] getInterfaces() Method[] getMethods() Constructor[] getConstructors() 35 ― объект, который представляет в runtime данные Class о классе объекта
  • 36. java.lang.Class Как получить Class<?> объект Class<?> clazz = object.getClass() Class<?> clazz = className.class //в том числе для простых типов Class<?> clazz = Class.forName(“java.io.Serializable”) Class[] clases = clazz.getInterfaces() 36
  • 37. java.lang.reflect.Member 37 java.lang.reflect.Member – интерфейс членов класса Классы реализующие интерфейс Member Field Method Constructor
  • 38. ReflectionHelper 38 public static Object createIntance(String className){ try { return Class.forName(className).newInstance(); } catch (…){…} }
  • 39. ReflectionHelper 39 public static void setFieldValue(Object object, String fieldName, String value){ try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); if(field.getType().equals(String.class)){ field.set(object, value); } else if ( field.getType().equals(int.class)){ field.set(object, Integer.decode(value)); } field.setAccessible(false); } catch(…){…} }
  • 40. План лекции 40 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 41. XML Serialization 41 Данные объекта ― иерархически упорядоченные поля простых типов XML документ ― иерархически упорядоченные тэги со строками Имя переменной ― имя тэга Значение переменной ― строковое значение тэга
  • 42. Отличия XML 42 Занчительно проще редактировать Значительно проще версионировать Нет привязки к типу Нет привязки к особенностям языка Избыточна Медленное чтение и запись
  • 43. SAX parser Simple API for XML (SAX) Стандартное средство обработки XML документов 43 Обходит XML дерево Посещает каждую ноду дерева Для каждой ноды вызывает 3 callback-а
  • 44. SAX parser 44 Порядок работы: Читаем формат документа Читаем первый тэг ― сообщаем приложению, что обработка начата Читаем содержимое тэга Сообщаем приложению содержимое тэга Рекурсивно обращаемся ко всем вложенным тэгам Сообщаем приложению, что обработка завершена
  • 45. SAX parser методы 45 org.xml.sax.helpers.DefaultHandle r Методы для обработки тегов во время обхода документа: startDocument() startElement(…) characters(…) endElement(…) endDocument() Обход дерева
  • 46. Десериализация XML 46 Задача: Разработать XML формат для документа так чтобы Можно было понять класс десериализуемого объекта Тэг с именем переменной содержал Атрибуты для восстановления переменной Значение переменной Записать ресурсы игры в выбранном формате
  • 47. Простой XML документ 47 <class type=“main.SerializationObject”> <name>Zully</name> <age>23</age> </class> Порядок обработки SAX парсером: startDocument startElement class startElement name endElement name startElement age endElement age endElement class endDocument
  • 48. Handler public class SaxEmptyHandler extends DefaultHandler { private static String CLASSNAME = "class"; private Object object; private String element; public void startElement(String uri, String localName, String qName, Attributes attributes) { … } public void endElement(String uri, String localName, String qName) { ... } public void characters(char ch[], int start, int length) { … } } 48
  • 49. Используем Reflection public void startElement(String uri, String localName, String qName, Attributes attributes) { if(qName != CLASSNAME){ element = qName; } else { String className = attributes.getValue(0); System.out.println("Class name: " + className); object = ReflectionHelper.createIntance(className); } } public void endElement(String uri, String localName, String qName) { element = null; } public void characters(char ch[], int start, int length) { if(element != null){ String value = new String(ch, start, length); System.out.println(element + " = " + value); ReflectionHelper.setFieldValue(object, element, value); } } 49
  • 50. DOM parser 50 Document Object Model Сначала прочитаем весь XML, потом обойдем все ноды javax.xml.parsers.DocumentBuilderFactory javax.xml.parsers.DocumentBuilder org.w3c.dom.Document File fXmlFile = new File(“test.xml”); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile);
  • 51. SAX & DOM сравнение 51 SAX parser DOM parser SAX (Simple API for XML) парсер не создает никакой внутренней структуры. Вместо этого, он берет все вхождения компонентов во входящем документе в виде событий (events) и говорит клиенту что он читает, поскольку он читает через входящий документ. DOM (Document Object Model) парсер создает древовидную структуру в памяти из входящего документа и лишь потом ждет запросов от клиента. SAX парсер всегда отдает клиенту лишь куски документа. Всегда отдает клиенту целый документ, независимо от того, сколько в действительности необходимо пользователю. Менее требователен к ресурсам и занимаемому свободному месту в случае использования больших входящих документов (потому что он не создает внутренней структуры). Также он запускается быстрее и более легок в изучении, чем DOM парсер. Имеет богатый функционал. Создает DOM-дерево в памяти и позволяет доступаться к любой части документа, а также модифицировать его. Но он не рационально распоряжается свободным местом в случае использования огромных документов. Используйте в следующих случаях: ▪ Входящий документ слишком велик для доступной памяти ▪ Когда необходимо прочитать лишь небольшой участок документа. ▪ Используя SAX, вы используете меньшее количество памяти и производите меньше динамических резерваций памяти. Используйте в следующих случаях: ▪ Вашему приложению необходимо иметь доступ к различным частям документа и использование собственной структуры столь же сложно, как и использование дерева DOM. ▪ Вашему приложению необходимо изменять дерево очень часто и данные должны быть сохранены на определенный период времени.
  • 52. План лекции 52 1. Random 2. Time и Date 3. I/O streams 4. Serialization 5. Reflection 6. SAX & DOM 7. Resource System
  • 53. Resource 53 ― интерфейс для всех объектов со статическими данными Resource Конкретный ресурс можно собрать на основе XML документа Ресурс одного типа может быть описан несколькими XML документами Уникальность игрового ресурса ― путь к его XML файлу XML документы для ресурсов создают дизайнеры Все параметры игры должны быть в ресурсах
  • 54. Resource Systen 54 Ресурсная система XML файлы с описанием игровых объектов Инструменты для редактирования XML файлов Инструменты для создания игровых объектов по ресурсам
  • 55. Resource Systen 55 В Allods Online 3 года разработки > 200 000 ресурсов Загрузка всех ресурсов примерно 30 минут На разработке ресурсной системы 2 программиста На разработке редакторов 3 программиста Ресурсы создавали > 10 дизайнеров
  • 56. ResourceFactory 56 ResourceFactory – фабрика ресурсов Возвращает объект ресурса по пути к XML файлу
  • 57. ДЗ 57 Вынести все параметры в XML файлы Создать interface Resource и class GMResource Создать class ResourceFactory (singleton) GMResource resource = (GMResource) ResourceFactory.instance().get(“./data/GMConfig.xml”)
  • 58. ResourceSystem * 58 Загрузка всех ресурсов при старте сервера Используем VFS.instance().getIterator(“./data”) Все ресурсы храним в директории ./data Обходим все файлы и создаем все ресурсы Ресурсы храним в Map<String, Resource>
  • 59. Спасибо за внимание Виталий Чибриков chibrikov@corp.mail.ru