Основы программирования на языке Java Стандартная библиотека Java: java.util, java.io, java.net (С) Всеволод Рылов, все права защищены Новосибирск, 2004 1 class Overview «interface» Iterator «interface» lang::Iterable + hasNext() : boolean + next() : E + remove() : void + iterator() : Iterator<T> Map Collection Entry Enumeration EventListener «interface» ListIterator Set Queue List SortedMap SortedSet + + + + + + + + + add(E) : void hasNext() : boolean hasPrevious() : boolean next() : E nextIndex() : int previous() : E previousIndex() : int remove() : void set(E) : void Observable 0..* Deque «interface» Observer NavigableMap NavigableSet + update(Observable, Object) : void «interface» Comparator + compare(T, T) : int + equals(Object) : boolean Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 2 Enumeration, Comparator Enumeration – объекты классов, реализующих данный интерфейс, используются для предоставления однопроходного последовательного доступа к серии объектов: Hashtable<String, String> t = …; for(Enumeration<String> e = t.keys(); e.hasMoreElements();) { String s = e.nextElement(); } Comparator – классы, реализующие данный интерфейс используются для обеспечения сравнения произвольных элементов. Используются при сортировке и организации упорядоченных контейнеров: Comparator<MyCalss> c = new Comparator<MyClass> (){…}; MyClass array[] = …; Arrays.sort(array,c); (С) Всеволод Рылов, все права защищены Новосибирск, 2004 3 Паттерн Model-View (Observer) class Model-View(Observer) Observable + + + + + + + + addObserver(Observer) : void countObservers() : int deleteObserver(Observer) : void deleteObservers() : void hasChanged() : boolean notifyObservers() : void notifyObservers(Object) : void Observable() «interface» Observer 0..* + update(Observable, Object) : void Design Model::MyModelClass + + + + # getData() : Object hasChanged() : boolean notifyObservers() : void notifyObservers(Object) : void setChanged() : void Новосибирск, 2004 +data Design Model::MyViewClass + update(Observable, Object) : void + updateView() : void (С) Всеволод Рылов, все права защищены 4 Коллекция объектов (контейнер) class Collection RuntimeException lang::IllegalStateException Iterable «interface» Collection + + + + + + + + + + + + + + + add(E) : boolean addAll(Collection<? extends E>) : boolean clear() : void contains(Object) : boolean containsAll(Collection<?>) : boolean equals(Object) : boolean hashCode() : int isEmpty() : boolean iterator() : Iterator<E> remove(Object) : boolean removeAll(Collection<?>) : boolean retainAll(Collection<?>) : boolean size() : int toArray() : Object[] toArray(T[]) : T[] «interface» Iterator RuntimeException NoSuchElementException + hasNext() : boolean + next() : E + remove() : void RuntimeException ConcurrentModificationException E AbstractCollection Новосибирск, 2004 RuntimeException lang::UnsupportedOperationException (С) Всеволод Рылов, все права защищены 5 Использование итераторов Collection<String> col = …; for (Iterator<String> i = col.iterator(); i.hasNext(); ) { String s = i.next(); } for (String s : col ) { s; } //Альтернатива ConcurrentModificationException – возникает когда коллекция изменена во время итерирования другим потоком IllegalStateException – возникает при попытке удаления элемента с помощью вызова remove(), когда еще не был вызван первый метод next(), или итератор указывает на конец коллекции (hasNext() возвращает false) NoSuchElementException – возникает при попытке вызова next() когда hasNext() возвращает flase UnsupportedOperationException – возникает при вызове метода который не поддерживается конкретной реализацией коллекции Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 6 Множества class Set E AbstractCollection AbstractSet Collection «interface» Set + + + + + + + + + + + + + + + add(E) : boolean addAll(Collection<? extends E>) : boolean clear() : void contains(Object) : boolean containsAll(Collection<?>) : boolean equals(Object) : boolean hashCode() : int isEmpty() : boolean iterator() : Iterator<E> remove(Object) : boolean removeAll(Collection<?>) : boolean retainAll(Collection<?>) : boolean size() : int toArray() : Object[] toArray(T[]) : T[] Новосибирск, 2004 # + + + AbstractSet() equals(Object) : boolean hashCode() : int removeAll(Collection<?>) : boolean E java.io.Serializable HashSet + + + + + + + + + + + + add(E) : boolean clear() : void clone() : Object contains(Object) : boolean HashSet() HashSet(Collection<? extends E>) HashSet(int, float) HashSet(int) isEmpty() : boolean iterator() : Iterator<E> remove(Object) : boolean size() : int (С) Всеволод Рылов, все права защищены 7 Упорядоченные множества class SortedSet E AbstractSet java.io.Serializable Set TreeSet «interface» SortedSet + + + + + + comparator() : Comparator<? super E> first() : E headSet(E) : SortedSet<E> last() : E subSet(E, E) : SortedSet<E> tailSet(E) : SortedSet<E> «interface» NavigableSet + + + + + + + + + + + + + + + ceiling(E) : E descendingIterator() : Iterator<E> descendingSet() : NavigableSet<E> floor(E) : E headSet(E, boolean) : NavigableSet<E> headSet(E) : SortedSet<E> higher(E) : E iterator() : Iterator<E> lower(E) : E pollFirst() : E pollLast() : E subSet(E, boolean, E, boolean) : NavigableSet<E> subSet(E, E) : SortedSet<E> tailSet(E, boolean) : NavigableSet<E> tailSet(E) : SortedSet<E> Новосибирск, 2004 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + add(E) : boolean addAll(Collection<? extends E>) : boolean ceiling(E) : E clear() : void clone() : Object comparator() : Comparator<? super E> contains(Object) : boolean descendingIterator() : Iterator<E> descendingSet() : NavigableSet<E> first() : E floor(E) : E headSet(E, boolean) : NavigableSet<E> headSet(E) : SortedSet<E> higher(E) : E isEmpty() : boolean iterator() : Iterator<E> last() : E lower(E) : E pollFirst() : E pollLast() : E remove(Object) : boolean size() : int subSet(E, boolean, E, boolean) : NavigableSet<E> subSet(E, E) : SortedSet<E> tailSet(E, boolean) : NavigableSet<E> tailSet(E) : SortedSet<E> TreeSet() TreeSet(Comparator<? super E>) TreeSet(Collection<? extends E>) TreeSet(SortedSet<E>) (С) Всеволод Рылов, все права защищены 8 Очереди class Queue «interface» Deque Collection «interface» Queue + + + + + + add(E) : boolean element() : E offer(E) : boolean peek() : E poll() : E remove() : E E AbstractCollection AbstractQueue E AbstractCollection ArrayDeque Новосибирск, 2004 + + + + + + + + + + + + + + + + + + + + + + + + + + + add(E) : boolean addFirst(E) : void addLast(E) : void contains(Object) : boolean descendingIterator() : Iterator<E> element() : E getFirst() : E getLast() : E iterator() : Iterator<E> offer(E) : boolean offerFirst(E) : boolean offerLast(E) : boolean peek() : E peekFirst() : E peekLast() : E poll() : E pollFirst() : E pollLast() : E pop() : E push(E) : void remove() : E remove(Object) : boolean removeFirst() : E removeFirstOccurrence(Object) : boolean removeLast() : E removeLastOccurrence(Object) : boolean size() : int (С) Всеволод Рылов, все права защищены 9 Списки class List «interface» Iterator + hasNext() : boolean + next() : E + remove() : void Collection «interface» List + + + + + + + + + + + + + + + + + + + + + + + + + Новосибирск, 2004 add(E) : boolean add(int, E) : void addAll(Collection<? extends E>) : boolean addAll(int, Collection<? extends E>) : boolean clear() : void contains(Object) : boolean containsAll(Collection<?>) : boolean equals(Object) : boolean get(int) : E hashCode() : int indexOf(Object) : int isEmpty() : boolean iterator() : Iterator<E> lastIndexOf(Object) : int listIterator() : ListIterator<E> listIterator(int) : ListIterator<E> remove(Object) : boolean remove(int) : E removeAll(Collection<?>) : boolean retainAll(Collection<?>) : boolean set(int, E) : E size() : int subList(int, int) : List<E> toArray() : Object[] toArray(T[]) : T[] «interface» ListIterator + + + + + + + + + (С) Всеволод Рылов, все права защищены add(E) : void hasNext() : boolean hasPrevious() : boolean next() : E nextIndex() : int previous() : E previousIndex() : int remove() : void set(E) : void 10 class List implementation Реализации списка E AbstractSequentialList java.io.Serializable LinkedList + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Новосибирск, 2004 add(E) : boolean add(int, E) : void addAll(Collection<? extends E>) : boolean addAll(int, Collection<? extends E>) : boolean addFirst(E) : void addLast(E) : void clear() : void clone() : Object contains(Object) : boolean descendingIterator() : Iterator<E> element() : E get(int) : E getFirst() : E getLast() : E indexOf(Object) : int lastIndexOf(Object) : int LinkedList() LinkedList(Collection<? extends E>) listIterator(int) : ListIterator<E> offer(E) : boolean offerFirst(E) : boolean offerLast(E) : boolean peek() : E peekFirst() : E peekLast() : E poll() : E pollFirst() : E pollLast() : E pop() : E push(E) : void remove(Object) : boolean remove(int) : E remove() : E removeFirst() : E removeFirstOccurrence(Object) : boolean removeLast() : E removeLastOccurrence(Object) : boolean set(int, E) : E size() : int toArray() : Object[] toArray(T[]) : T[] Deque List E AbstractList java.io.Serializable ArrayList + + + + + + + + + + + + + + + + + + + + + + add(E) : boolean add(int, E) : void addAll(Collection<? extends E>) : boolean addAll(int, Collection<? extends E>) : boolean ArrayList(int) ArrayList() ArrayList(Collection<? extends E>) clear() : void clone() : Object contains(Object) : boolean ensureCapacity(int) : void get(int) : E indexOf(Object) : int isEmpty() : boolean lastIndexOf(Object) : int remove(int) : E remove(Object) : boolean set(int, E) : E size() : int toArray() : Object[] toArray(T[]) : T[] trimToSize() : void (С) Всеволод Рылов, все права защищены 11 Пример простой реализации стека import java.util.*; public class Stack<T> { private LinkedList<T> content; public Stack() { content = new LinkedList<T>(); } public void push(T obj) { content.addFirst(obj); } public T pop() throws NoSuchElementException { return content.removeFirst(); } public boolean hasMoreElements() { if (content.size() > 0) return true; else return false; } Новосибирск, 2004 public static void main(String args[]) throws NoSuchElementException { Stack<String> s = new Stack<String>(); for (String o : args) { s.push(o); } while(s.hasMoreElements()) { System.out.println(s.pop()); } } } (С) Всеволод Рылов, все права защищены 12 Ассоциативные контейнеры class Maps «interface» Map::Entry + + + + + «interface» Map + + + + + + + + + + + + + + clear() : void containsKey(Object) : boolean containsValue(Object) : boolean entrySet() : Set<Map.Entry<K, V>> equals(Object) : boolean get(Object) : V hashCode() : int isEmpty() : boolean keySet() : Set<K> put(K, V) : V putAll(Map<? extends K, ? extends V>)... remove(Object) : V size() : int values() : Collection<V> Новосибирск, 2004 equals(Object) : boolean getKey() : K getValue() : V hashCode() : int setValue(V) : V K V AbstractMap HashMap + + + + + + + + + + + + + + + + + clear() : void clone() : Object containsKey(Object) : boolean containsValue(Object) : boolean entrySet() : Set<Map.Entry<K,V>> get(Object) : V HashMap(int, float) HashMap(int) HashMap() HashMap(Map<? extends K, ? extends V>) isEmpty() : boolean keySet() : Set<K> put(K, V) : V putAll(Map<? extends K, ? extends V>) : void remove(Object) : V size() : int values() : Collection<V> (С) Всеволод Рылов, все права защищены 13 class SortedMap K V Map AbstractMap java.io.Serializable «interface» SortedMap + + + + + + + + + TreeMap comparator() : Comparator<? super K> entrySet() : Set<Map.Entry<K, V>> firstKey() : K headMap(K) : SortedMap<K,V> keySet() : Set<K> lastKey() : K subMap(K, K) : SortedMap<K,V> tailMap(K) : SortedMap<K,V> values() : Collection<V> «interface» NavigableMap + + + + + + + + + + + + + + + + + + + + + ceilingEntry(K) : Map.Entry<K,V> ceilingKey(K) : K descendingKeySet() : NavigableSet<K> descendingMap() : NavigableMap<K,V> firstEntry() : Map.Entry<K,V> floorEntry(K) : Map.Entry<K,V> floorKey(K) : K headMap(K, boolean) : NavigableMap<K,V> headMap(K) : SortedMap<K,V> higherEntry(K) : Map.Entry<K,V> higherKey(K) : K lastEntry() : Map.Entry<K,V> lowerEntry(K) : Map.Entry<K,V> lowerKey(K) : K navigableKeySet() : NavigableSet<K> pollFirstEntry() : Map.Entry<K,V> pollLastEntry() : Map.Entry<K,V> subMap(K, boolean, K, boolean) : NavigableMap<K,V> subMap(K, K) : SortedMap<K,V> tailMap(K, boolean) : NavigableMap<K,V> tailMap(K) : SortedMap<K,V> Новосибирск, 2004 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ceilingEntry(K) : Map.Entry<K,V> ceilingKey(K) : K clear() : void clone() : Object comparator() : Comparator<? super K> containsKey(Object) : boolean containsValue(Object) : boolean descendingKeySet() : NavigableSet<K> descendingMap() : NavigableMap<K, V> entrySet() : Set<Map.Entry<K,V>> firstEntry() : Map.Entry<K,V> firstKey() : K floorEntry(K) : Map.Entry<K,V> floorKey(K) : K get(Object) : V headMap(K, boolean) : NavigableMap<K,V> headMap(K) : SortedMap<K,V> higherEntry(K) : Map.Entry<K,V> higherKey(K) : K keySet() : Set<K> lastEntry() : Map.Entry<K,V> lastKey() : K lowerEntry(K) : Map.Entry<K,V> lowerKey(K) : K navigableKeySet() : NavigableSet<K> pollFirstEntry() : Map.Entry<K,V> pollLastEntry() : Map.Entry<K,V> put(K, V) : V putAll(Map<? extends K, ? extends V>) : void remove(Object) : V size() : int subMap(K, boolean, K, boolean) : NavigableMap<K,V> subMap(K, K) : SortedMap<K,V> tailMap(K, boolean) : NavigableMap<K,V> tailMap(K) : SortedMap<K,V> TreeMap() TreeMap(Comparator<? super K>) TreeMap(Map<? extends K, ? extends V>) TreeMap(SortedMap<K, ? extends V>) values() : Collection<V> (С) Всеволод Рылов, все права защищены 14 class Vector Вектор E AbstractList java.io.Serializable Vector List Новосибирск, 2004 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + add(E) : boolean add(int, E) : void addAll(Collection<? extends E>) : boolean addAll(int, Collection<? extends E>) : boolean addElement(E) : void capacity() : int clear() : void clone() : Object contains(Object) : boolean containsAll(Collection<?>) : boolean copyInto(Object[]) : void elementAt(int) : E elements() : Enumeration<E> ensureCapacity(int) : void equals(Object) : boolean firstElement() : E get(int) : E hashCode() : int indexOf(Object) : int indexOf(Object, int) : int insertElementAt(E, int) : void isEmpty() : boolean lastElement() : E lastIndexOf(Object) : int lastIndexOf(Object, int) : int remove(Object) : boolean remove(int) : E removeAll(Collection<?>) : boolean removeAllElements() : void removeElement(Object) : boolean removeElementAt(int) : void retainAll(Collection<?>) : boolean set(int, E) : E setElementAt(E, int) : void setSize(int) : void size() : int subList(int, int) : List<E> toArray() : Object[] toArray(T[]) : T[] toString() : String trimToSize() : void Vector(int, int) Vector(int) Vector() Vector(Collection<? extends E>) E Stack + + + + + + empty() : boolean peek() : E pop() : E push(E) : E search(Object) : int Stack() (С) Всеволод Рылов, все права защищены RuntimeException EmptyStackException + EmptyStackException() 15 class Old Хеш-таблица K V Map Dictionary + + + + + + + + Dictionary() elements() : Enumeration<V> get(Object) : V isEmpty() : boolean keys() : Enumeration<K> put(K, V) : V remove(Object) : V size() : int K V java.io.Serializable Hashtable Properties #defaults + + + + + + + + + + + + + + + + + getProperty(String) : String getProperty(String, String) : String list(PrintStream) : void list(PrintWriter) : void load(Reader) : void load(InputStream) : void loadFromXML(InputStream) : void Properties() Properties(Properties) propertyNames() : Enumeration<?> save(OutputStream, String) : void setProperty(String, String) : Object store(Writer, String) : void store(OutputStream, String) : void storeToXML(OutputStream, String) : void storeToXML(OutputStream, String, String) : void stringPropertyNames() : Set<String> Новосибирск, 2004 + + + + + + + + + + + + + + + + + + + + + + + clear() : void clone() : Object contains(Object) : boolean containsKey(Object) : boolean containsValue(Object) : boolean elements() : Enumeration<V> entrySet() : Set<Map.Entry<K,V>> equals(Object) : boolean get(Object) : V hashCode() : int Hashtable(int, float) Hashtable(int) Hashtable() Hashtable(Map<? extends K, ? extends V>) isEmpty() : boolean keys() : Enumeration<K> keySet() : Set<K> put(K, V) : V putAll(Map<? extends K, ? extends V>) : void remove(Object) : V size() : int toString() : String values() : Collection<V> (С) Всеволод Рылов, все права защищены 16 Класс-утилита Collections Служит для поддержки классов контейнеров и осуществления основных манипуляций с содержимым: sort(List), sort(List, Comparator) binarySearch(List, Object), binarySearch(List, Object, Comparator) reverse(List) shuffle(List), shuffle(List,Random) fill(List,Object) copy(List, List) min(Collection), min(Collection, Comparator) max(Collection), max(Collection,Comoarator) Представляет коллекцию как Enumeration (метод enumeration(Collection)) Создает не модифицируемый список, содержащий несколько копий объекта: nCopies(int,Object):List Содержит специальные статические поля: EMPTY_SET, EMPTY_LIST, EMPTY_MAP Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 17 Класс-утилита Collections (продолж.) Предоставляет обертки для защиты контейнеров от модификации или для обеспечения синхронизированного доступа: unmodifiableXXX(arg:XXX):XXX synchronizedXXX(arg:XXX):XXX XXX - это Collection, Set, SortedSet, List, Map, SortedMap Предоставляет не модифицируемые обертки-одиночки, содержащие только один элемент (или пару ключ-значение): singleton(Object):Set singletonList(Object):List singletonMap(Object,Object):Map Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 18 Работа со временем TimeZone Calendar Date GregorianCalendar Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 19 Таймер и планируемые задания Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 20 Интернационализация Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 21 Подсистема ввода-вывода java.io InputStream OutputStream IOException Reader Writer <<Interface>> DataInput <<Interface>> DataOutput <<Interface>> Serializable <<Interface>> ObjectInput <<Interface>> ObjectOutput <<Interface>> Externalizable Новосибирск, 2004 File (С) Всеволод Рылов, все права защищены 22 Средства работы с файлами Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 23 Потоки ввода-вывода Потоки ввода вывода бывают двух типов: узловые потоки (node streams) – предоставляют ввод вывод на уровне потоков байт фильтрующие потоки (filter streams) – предоставляют обертки вокруг низкоуровневых потоков для обеспечения расширенной функциональности Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 24 Узловые потоки Узловые потоки работают непосредственно с подлежащими источниками (приемниками) данных на уровне байт. Источниками(приемниками) могут быть: файлы на файловой системе – FileInputStream, FileOutputStream массивы байт в памяти – ByteArrayInputStream, ByteArrayOutputStream каналы (pipes) - PipedInputStream, PipedOutputStream строки – StringBufferInputStream (deprecated) прочие источники – сокеты и т.д: something.getInputStream(), something.getOutputStream() Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 25 Пример – копирование файлов import java.io.*; public class FileCopy { public static void main(String args[]) { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(args[0]); out = new FileOutputStream(args[1]); } catch (Exception e) { System.out.println("Неправильные аргументы"); if (in!=null) try {in.close();} catch(IOException ix2){} return; } byte buf[] = new byte[1024]; //Буфер для хранения промежуточного блока int read; //Переменная для хранения количества прочитанных байт try { while ( (read = in.read(buf)) >= 0) //При достижении конца вернет <0 out.write(buf, 0, read); //Записываем ровно столько сколько удалось прочитать } catch (IOException ioex) { System.out.println(“Ошибка ввода/вывода:”+ioex.getLocalizedMessage()); } finally { try {in.close();} catch(IOException ix2){} try {out.close();} catch (IOException ix3) {} } } Новосибирск, 2004 } (С) Всеволод Рылов, все права защищены 26 Фильтрующие потоки Фильтрующие потоки предоставляют дополнительную функциональность на основе других потоков абстрактные – FilterInputStream, FilterOutputStream буферизация – BufferedInputStream, BufferedOutputStream форматированный ввод-вывод данных – DataInputStream, DataOutputStream сериализация объектов – ObjectInputStream, ObjectOutputStream опережающее чтение – PushbackInputStream объединение потоков – SequenceInputStream печатный поток вывода – PrintStream построчное чтение – LineNumberInputStream (deprecated) Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 27 Произвольный доступ к файлу RandomAccessFile используется для осуществления произвольного доступа к содержимому файла: обеспечивает форматированный ввод-вывод данных (реализует интерфейсы DataInput и DataOutput) void seek(long) - позиционирование в файле long getFilePointer() - текущая позиция курсора Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 28 Символьные потоки (readers & writers) В отличие от байтовых потоков, работают на уровне символов, что позволяет корректно работать с различными кодировками В качестве мостов между байтовыми и символьными потоками используются классы InputStreamReader и OutputStreamWriter Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 29 Символьные потоки Узловые символьные потоки: файловые – FileReader, FileWriter на основе массивов символов – CharArrayReader, CharArrayWriter канальные – PipedReader, PipedWriter строковые – StringReader, StringWriter Фильтрующие символьные потоки: абстрактные – FilterReader, FilterWriter буферизирующие – BufferedReader, BufferedWriter переходные – InputStreamReader, OutputStreamWriter опережающее чтение – PushbackReader по строчное чтение – LineNumberReader печатный поток вывода – PrintWriter Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 30 StreamTokenizer class Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 31 Сериализация объектов Средства сериализации и десериализации объектов пакета java.io реализуют поддержку принципа сохраняемости ООП Сериализация используется для сохранения иерархий объектов для передачи в другую виртуальную машину, либо для последующего восстановления в другом сеансе работы системы Особенности сериализации: версионность классов сериализуемых объектов сохранение иерархий кеширование и переиспользование ссылок на уже сериализованные объекты средства управления процессом сериализации (десериализации) объектов Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 32 Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 33 Исключения при сериализации Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 34 Общие правила Классы, объекты которых подлежат сериализации должны реализовывать маркерный интерфейс java.io.Serializable По умолчанию подлежат сохранению все поля объектов не объявленные transient. Статические поля не сеариализуются Для сериализации и десериализации используются фильтрующие потоки ObjectOutputStream и ObjectInputStream Сериализуемые поля класса реализующего интерфейс Serializable должны быть примитивными типами либо типами, реализующими интерфейс Serializable Если класс имеет своим суперклассом класс, не реализующий интерфейс Serializable, то у данного суперкласса должен быть доступен конструктор с пустым списком аргументов Сериалиазации внутренних или анонимных классов следует категорически избегать Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 35 Управление сериализацией объекта Для явного определения списка сериализуемых полей нужно в классе объявить поле private static final ObjectStreamField[] serialPersistentFields = {…}; Для управления процессом сериализации/десериализации нужно в классе объявить методы: private void writeObject(java.io.ObjectOutputStream out) throws IOException {…} private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {…} Для управления замещением объкта при сериализации/десериализации нужно определить методы: Object writeReplace() throws ObjectStreamException {…} Object readResolve() throws ObjectStreamException {…} Для явного задания номера версии нужно определить поле static final long serialVersionUID = …; Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 36 Интерфейс java.io.Externalizable Позволяет полностью управлять форматом записи данных класса (автоматически сохраняется только информация об классе и объекте) Для сохранения состояния нужно реализовать метод public void writeExternal(ObjectOutput out) throws IOException Для восстановления состояния нужно реализовать метод public void readExternal(ObjectInput in) throws IOException, java.lang.ClassNotFoundException Класс реализующий интерфейс Externalizable должен иметь public конструктор с пустым списком аргументов Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 37 Версионность Изменения, ведущие к несовместимости версий классов: Удаление полей не объявленных transient Изменение позиции класса в иерархии классов Изменение факта наличия/отсутствия модификаторов static и transient у поля Изменение типа у поля примитивного (встроенного) типа Изменение реализации методов writeObject() и readObject() на предмет использования методов defaultWriteObject() и defaultReadObject() классов ObjectOutputStream и ObjectInputStream соответственно Изменение класса с Serializable на Externalizable и наоборот Добавление методов writeReplace() или readResolve() Изменение факта наследования классом интерфейсов Serializable или Externalizable Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 38 Работа с сетью Для работы с сетью используется пакет java.net, предоставляющий средства: адресации в Internet (InetAddress, + средства java 1.4: Inet4Address, Inet6Address, InetSocketAddress, SocketAddress) работы с протоколом TCP (Socket, ServerSocket, SocketOptions) работы с протоколом UDP (DatagramSocket, DatagramPacket, MulticastSocket) работы с URL и поддержки HTTP (URL, URLConnection, HttpURLConnection, JarURLConnection, URLDecoder, URLEncoder, ContentHandler, URLStreamHandler) авторизации в Internet (Authenticator, PasswordAuthentication) динамической загрузки классов из сети (URLClassLoader) Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 39 Исключения пакета java.net IOException (from io) UnknownServiceException UnknownHostException SocketException ProtocolException MalformedURLException NoRouteToHostException ConnectException BindException Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 40