Upload
andie
View
48
Download
0
Embed Size (px)
DESCRIPTION
Pakiety Javy, Java. Wykład 6. mgr inż. Michał Misiak. Plan wykładu. Obsługa wejścia/wyjścia (I/O API) Kolekcje Aplety. Podstawy obsługi wejścia/wyjścia. Mechanizm ten bazuje na standardowym mechanizmie obsługi strumieni (stream) - PowerPoint PPT Presentation
Citation preview
Uniwersytet ŁódzkiWydział Matematyki i Informatyki, Katedra Analizy Nieliniowej
Pakiety Javy, Java
Wykład 6
mgr inż. Michał Misiak
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Plan wykładu
Obsługa wejścia/wyjścia (I/O API) Kolekcje Aplety
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Podstawy obsługi wejścia/wyjścia
Mechanizm ten bazuje na standardowym mechanizmie obsługi strumieni (stream)
Strumień I/O określony jest przez źródło (input source) oraz ujście (output destination)
Strumień może reprezentować różne rodzaje źródeł oraz ujść np. pliki, urządzenia, pamięć, inne programy, etc…
Strumienie mogą wspierać różne typy danych: bajt, obiekty, prymitywne typy danych, etc…
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie wejściowe/wyjściowe Strumień wejściowy
służy do czytania porcji danych, przychodzących z innego źródła
Strumień wyjściowy służy do zapisu porcji danych, które zostaną przesłane do ujścia
źródło: http://java.sun.com/docs/books/tutorial/essential/io/streams.html
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie Bajtowe (byte streams)
Strumienie bajtowe wykorzystywane są do przesyłania danych w postaci paczek 8 bitów
Wszystkie strumienie pochodzą od klas: OutputStream i InputStream
Przykład strumienia do pliku: FileInputStream i FileOutputStream
Przykład 1(P1) „KopowianieBajtow” Funkcja read() zwraca wartość int
zamiast Byte, ponieważ umożliwa to wykrycie sytuacji końca strumienia. Read() zwraca wówczas -1.
Każdy strumień musi zostać zamknięty close(). Zamknięcie strumienia powinno odbywać się w klauzuli finaly. Pozwala to uchronić przed niepotrzebnymi wyciekami.
Pozostałe typy strumieni bazują na typie bajtowym
Przykład 1. Czytanie i zapisywanie strumieni.
I n X a n n
I n X a
Strumień wejściowy
Strumień wyjściowy
aint c =
in.read()
in
out
out.write(c)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie znaków (character streams) Przechowywanie znaków w konwencji Unicode przez JVM. Automatyczna konwersja
lokalnych formatów do Unicode, nie jest wymagane dodatkowe sprawdzanie wyjściowego formatu przez programistę
Nie jest bardziej złożony niż strumień bajtów Wszystkie strumienie znakowe wyprowadzane są z klas: Reader & Writer. Np. dla
plików: FileReader & FileWriter P2. CopyCharacters. Warto zauważyć, że zmienna służąca do kopiowania jest
podobnie jak w P1 typu int. Różnica: w P1 int bierze 8 bitów, w P2 int bierze 16 bitów Strumienie znakowe wykorzystują sekwencje:
znak powrotu oraz znak końca linii (\r\n) tzw. carriage-return i line-feed lub jedno znakowy: znak końca linii (\n) oraz powrót (\r)
Zastosowanie powyższych znaków pozwala pisać programy na dowolne systemy operacyjne.
P3. Program CopyCharacters z uwzględnieniem końca linii. Klasy BufferReader & PrintWriter. Metody readLine & println
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie buforowane (Buffered Streams) Mała efektywność wykorzystania strumieni niebuforowanych – konieczność
każdorazowego wołania metody wirte & read przez system operacyjny (konieczność uzyskania dostępu do dysku, ograniczenia w wydajności sieci, etc…)
Zwiększenie efektywność po przez wykorzystanie tzw. buffered streams na poziomie JVM. Dostęp do zasobów jest jednorazowy dla stosunkowo dużej liczby danych.
Dane zapisywane są w buforze. Jeśli bufor staje się pełny wówczas wołane są funkcje natywne dla SO. Jeśli bufor czytający jest pusty wówczas wołane są funkcje SO i bufor zostaje uzupełniony.
Możliwość konwersji niebuforowanego strumienia do buforowanego: Przykład:
inputStream = new BufferedReader(new FileReader("x.txt"));outputStream = new BufferedWriter(new FileWriter(„y.txt"));
Klasy do tworzenia strumieni buforowanych: BufferedInputStream & BufferedOutputStream – dla typu bajt BufferedReader & BufferedWriters – dla typu character
Czyszczenie strumienia: flushing
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Formatowanie Strumienie implementujące
formatowanie są instancjami PrintWriter i PrintStream (System.out, System.err)
Dwa poziomy formatowania: print i println – formatują dane
wyjściowe w standardowy sposób format – duże możliwości
sparametryzowania sposobu formatowania danych wyjściowych
Metoda format zawiera zbiór parametrów specyfikujących sposób wyświetlenia argumentów znajdujących się w tekście
System.out.format("The square root of %d is %f.%n", i, r);
Parametry konwertujące: Format d – formatuje wartość intger
do wartości dziesiętnej Format f – formatuje wartość typu
float do wartości dziesiętnej n - generuje ciąg znaków zakończony
specyficznym dla danej platformy zakończeniem linii.
Format x – formatuje wartość integer do wartości szesnastkowej
Format s – traktuje każdą wartość jako string
Format tB – formatuje integer jako nazwę miesiąca
Więcej! http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Formatowanie zasady Precyzja – jest to matematyczna
dokładność dla zmiennych typu float. Dla s i pozostałych ogólnych konwersji jest to maksymalna długość. Liczba jest przycinana od prawej strony.
Długość – jest to minimalna długość ciągu znaków. Jeśli potrzeba następuje uzupełnienie do wymaganego minimum od lewej strony.
Flaga – specyfikuje dodatkowe opcje formatowania. Np. + - określa, że liczba zawsze powinna być wyświetlana ze znakiem, a 0, że 0 jest znakiem, który będzie powtarzany w przypadku uzupełniania. . – oznacza format liczby z specyficznym dla danej platformy separatorem.
Indeks argumentu – pozwala na bezpośrednie wskazanie zmiennej, do której tyczy się dany format.
% 1$ +0 20 .10 f
Zna
k p
oczą
tku
form
ato
wan
ia
Specyfikator formatu
Inde
ks a
rgum
entu
Fla
ga
Licz
ba z
nakó
w
Pre
cyzj
a
Rod
zaj k
onw
ers
ji
Przykład: System.out.format("%f, %1$+020.10f %n", Math.PI); 3.141593, +00000003.1415926536
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
I/O dla konsoli
Standardowy strumień – charakterystyczne dla wielu systemów operacyjnych. Dane czytają z klawiatury i wyświetlają na konsoli. Wspierają również I/O na plikach pomiędzy programami.
JVM wspiera trzy strumienie: Standard Input: System.in Standard Output: System.out (PrintStream) Standard Error: System.err (PrintStream)
Strumienie zarządzane przez JVM są tworzone automatycznie i nie jest wymagane ich otwieranie
System.out i System.err są strumieniami bajtowymi natomiast mają cechy strumieni znakowych.
System.in, żeby wspierać cechy strumieni znaków musi zostać opakowany. InputStreamReader cin = new InputStreamReader(System.in);
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Konsola
Bardziej zawansowana wersja strumieni. Umożliwia m.in. Wprowadzanie haseł.
Nie zawsze jest dostępna. Jeśli metoda System.console() zwróci null wówczas dany SO nie wspiera konsoli lub program został uruchomiony w nieinteraktywnym otoczeniu.
Wprowadzanie haseł w bezpieczny sposób realizowane przy pomocy metody readPassword. Metoda ta gwarantuje: Przykrycie wprowadzanego hasła * na ekranie Szybkość usunięcia z pamięci, gdyż metoda zwraca tablicę znaków,
która może być od razu nadpisana, a nie String Przykład 3 (P3) – (linux)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie danych (data streams)
Wspierają bitową reprezentację podstawowych typów Implementują interfejs DataInput lub DataOutput Przykład:
Utworzenie strumienia do zapisu: out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
Zapis do strumienia porcji danych: out.writeDouble(table[i]); out.writeUTF(table2[i]); - zapis z użyciem kodowania UTF-8
Utworzenie strumienia do czytania in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
Odczyt porcji danych ze strumienia: int libcza in.readInt(); String znak = in.readUTF();
DataStreams wykrywają koniec pliku i informują o tym fakcie po przez rzucenie wyjątku: EOFException
Do programisty należy odpowiednio sekwencyjne używanie funkcji read i wirte przypisanych wybranym formatom
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Serializacja
Proces konwersji instancji obiektu, który posiada referencje na inne obiekty do postaci liniowego strumienia bitów. Zachowanie stanu obiektu.
Po serializacji obiekt może zostać przesłany przez sieć (gniazda) i odtworzony po drugiej stronie.
Serializacja jest mechanizmem standardowo używanym przez RMI.
Programista, który chce posługiwać się tym mechanizmem musi zaimplementować interfejs Serializable. Większość klas podstawowych posiada zaimplementowany interfejs Serializable.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie obiektów
Wspierają przesyłanie obiektów. Klasami implementującymi strumienie obiektów są:
ObjectInputStream i ObjectOutputStream. Obiekty te implementują ObjectInput & ObjectOutput, które dziedziczą po DataInput/Output. Podstawowe metody z DataStream zaimplementowane są w tych klasach.
Istotne metody writeObject & readObject. Metoda readObject musi pozwolić na konstrukcję obiektu, który
mógł zawierać wskazania na inne obiekty, a te obiekty mogą mieć referencje na inne, etc…
Metoda writeObject tworzy drzewo obiektów i zapisuje do strumienia. Czasami wywołanie tej metody może spowodować zapis dużej ilości danych.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Strumienie plików Ułatwiają niezależną od platformy obsługę
plików (zmiana nazwy, zmiana atrybutów, kasowanie).
Instancja typu File odwołuje się do nazwy plików. Nie warunkuje to istnienia pliku.
Utworzenie zmiennej reprezentującej plik: File a = new File(„plik.txt");
Różne zachowanie metody klasy File w zależności od systemu operacyjnego np. AbsolutePath().
Tworzenie ścieżki charakterystycznej dla danego SO (wykorzystanie File.separtor)
File b = new File(".." + File.separator + „przyklad" + File.separator + „plik.txt");
Przykład 4 (P4). Koncepcja Random Access File
Przykłady metod klasy File Usuwanie:
delete – natychmiastowe usunięcie pliku
deleteOnExit – plik jest usuwany w momencie zakończenia działania JVM
Informacje o pliku Ustawianie atrybutów
setLastModified Zmiana nazwy pliku
renameTo() Praca z katalogami
Mkdir – tworzenie katalogów List i ListFiles – listuje zawartość
katalogów
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kolekcje (Collection)
Kolekcja jest to obiekt, który gromadzi i przechowuje zbiór innych obiektów porządkując je w określony sposób – tworzy strukturę danych.
Przykładami kolekcji są: Vector, Hashtable, tablica (array) Szkielet kolekcji (Collection Framework - CF) jest to architektura
pozwalająca na manipulowanie oraz reprezentowanie dowolnych zbiorów. Przykładem takiego szkieletu kolekcji jest STL w C++.
Elementami Collection Framework są: Interfejsy. Pozwalają na abstrakcyjne manipulowanie przechowywanymi danymi. Implementacje. Konkretne implementacje interfejsów. Są to gotowe do użycia
struktury danych. Algorytmy. Są to metody, które mogą być wykonywane na obiektach, które
implementują interfejsy collection framework np. szukanie, sortowanie. Kolekcje były uważane jako mało wydajne podejście do reprezentacji
struktur danych.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Korzyści ze stosowania kolekcji
Redukcja nakładu pracy poświęcanego na tworzenie struktur danych i implementację algorytmów. Wykorzystanie standardowych kolekcji pozwala na łatwiejszą integrację
Zwiększenie szybkość wykonywania programu oraz jego jakości. Collection Framework posiada efektywnie zaimplementowane algorytmy oraz struktury danych. Programista może się skupić na ulepszaniu samego programu.
Zmniejsza wysiłki potrzebne na poznanie nowych API. Brak konieczności projektowania nowych API – zastosowanie
wcześniej stworzony przez specjalistów standardow. Wielokrotne wykorzystanie kodu.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejsy w CF
Dwa drzewa kolekcji Set jest specjalizowaną kolekcją
Collection, a SortedSet jest specjalizowaną kolekcją Set
Wszystkie kolekcje są generyczne (możliwość użycia dowolnego typu) public interface Collection<E>...
Przy deklarowaniu kolekcji należy wskazać typ. Gwarantuje to możliwość wykrycia błędu na poziomie kompilacji
Zrozumienie stosowania interfejsów kluczem do korzystania z CF
Collection
Set List Queue
SortedSet
Map
SortedMap
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejsy CF
Collection – grupa obiektów nazywanych elementami. Obiekty te mogą się duplikować, mogą, ale nie musza być posortowane.
Set – nie może zawierać takich samych dwóch elementów. Modeluje matematyczną abstrakcję zbioru.
SortedSet – zbiór uwzględniający porządek.
List – uporządkowany zbiór. Może zawierać dwa takie same elementy. Użytkownik może decydować, gdzie dany element zostanie wstawiony (na podstawie indeksu).
Queue – kolejka elementów. Może być FIFO lub LIFO. Elementy mogą być ustawiane z priorytetami.
Map – pozwala przypisywać kluczom określone wartości. Nie może zawierać duplikujących się kluczy.
SrotedMap – Map uwzględniający kolejność elementów zgodnie z malejącymi/rosnącymi wartościami klucza.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Collection
Ma zastosowanie w przypadku, gdy jest wymagana duża ogólność dotycząca sposobu uporządkowania oraz unikatowości elementów
Posiada konstruktor pozwalający na konwersje to szczególnej kolekcji. List<String> list = new
ArrayList<String>(c)
public interface Collection<E> extends Iterable<E> {
// podstawowe operacje int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); //optional boolean remove(Object element); Iterator<E> iterator(); // masowe operacje boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E>
c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); // operacje na tablicach Object[] toArray(); <T> T[] toArray(T[]
a); }
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przechodzenie przez Collection
For-each Proste przejście przez całą
kolekcję for (Object o : collection)
System.out.println(o);
Iterators Możliwość przechodzenia przez
kolekcję i usuwania pożądanych elementów
Iterator zostaje pobrany po przez wywołanie metody kolekcji iterator
Umożliwia usunięcie aktualnego elementu w przeciwieństwie do for-each
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
static void filter(Collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); }
Inte
rfej
sP
rzyk
ład
Polimorficzność kodu!!!
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Set Zawiera metody odziedziczone z
Collection i dodaje, te które uniemożliwiają istnienie dwóch takich samych elementów.
Specyficzne zachowanie metod equals and hashCode
Przykładowe implementacje: HashSet – przechowuje elementy w
tablicy. Bardzo wydajne jednak nie gwarantuje kolejności iteracji.
TreeSet – przechowuje elementy w drzewie czerwono-czarnym. Kolejność na podstawie wartości. Wolniejsze niż HashSet.
LinkedHashSet – zaimplementowany jako tablica z listą.
Przykład: Collection<Type> noDups = new
HashSet<Type>(c);
public interface Set<E> extends Collection<E> {
// podstawowe operacje int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); // operacje zbiorcze boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E>
c); boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear(); Object[] toArray(); <T> T[] toArray(T[] a);}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Podstawowe operacje na Set
import java.util.*;
public class FindDups { public static void main(String[] args) { Set<String> s = new HashSet<String>(); for (String a : args) if (!s.add(a)) System.out.println("Duplicate detected: " + a);
System.out.println(s.size() + " distinct words: " + s); }}
Prz
ykła
dUwagi!• używaj typu Set zamiast konkretnego typu jak np. HashSet. Pozwoli to na elastyczniejsze programowanie po przez wykorzystanie polimorfizmu•
Źródło: Java Sun Tutorial
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
List List uwzględnia następujące rodzaje
operacji na kolekcji: dostęp do wskazanego elementu (positional
access) Szukanie Iteracje Widok zakresu
Java dostarcza dwa rodzaje implementacji List:
ArrayList – stosunkowo wydajna LinkedList – lepsza wydajność przy
określonych warunkach. Porównanie do wektora:
Długość nazw metod umieszczających elementy w kolekcji: setElement(), a w List set()
Ta sama metoda set dla wstawiania elementów na określonej pozycji
Iteracja w List może odbywać się w dwóch kierunkach
public interface List<E> extends Collection<E> {
// dostęp do danej pozycji E get(int index); E set(int index, E element); boolean add(E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection<? extends E> c); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); ListIterator<E> listIterator(int
index); List<E> subList(int from, int
to);}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Podstawowe operacje na List
public static <E> void swap(List<E> a, int i, int j) { E tmp = a.get(i); a.set(i, a.get(j)); a.set(j, tmp);}
Prz
ykła
d
Uwagi! Powyższy przykład implementuje metodę zamiany miejscami dwóch wybranych elementów.
Zaimplementowane algorytmy:• sort – sortuje listę z wykorzystaniem algorytmu sortowania przez scalanie.• shuffle – losowa permutacja elementów• reverse – odwórcenie kolejności elementów w liście• rotate – rotacja elementów z określoną odległością• swap – zamiana dwóch elementów miejscami• replaceAll – zamiana wszystkich wystąpień określonej wartości przez inna wartość• fill - nadpisanie każdego elementu posiadającego określoną wartość• copy – utworzenie kopi listy• binarySearch – przeszukiwanie z algorytmem drzewa binarnego• indexOfSubList – indeks pierwszej pod listy, która jest równa danej liście• lastIndexOfSubList – zawraca indeks ostatniej podlisty, która jest równa danej liście
public static <E> void swap(List<E> a, int i, int j) { E tmp = a.get(i); a.set(i, a.get(j)); a.set(j, tmp);}
Prz
ykła
d
Uwagi! Powyższy przykład pokazuje sposób wykonania iteracji wstecz.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Queue Kolejka przechowuje elementy w kolejności
do przetwarzania. Dwa rodzaje kolejek:
zwraca określaną wartość, gdy operacja się nie powiedzie
rzuca wyjątkiem, gdy operacja się nie powiedzie
Element na początku będzie elementem usuwanym jako pierwszy (LIFO) lub jako ostatni (FIFO)
Kolejki mogą mieć określą liczbę elementów (bounded)
Pobieranie i usuwanie elementów poll Remove
Pobieranie elementu bez usuwania peek element
public interface Queue<E> extends Collection<E> {
E element(); boolean offer(E e); E peek(); E poll(); E remove();}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Queue - przykład
import java.util.*;
public class Countdown { public static void main(String[] args) throws InterruptedException { int time = Integer.parseInt(args[0]); Queue<Integer> queue = new LinkedList<Integer>(); for (int i = time; i >= 0; i--) queue.add(i); while (!queue.isEmpty()) { System.out.println(queue.remove()); Thread.sleep(1000); } }}
Prz
ykła
dPrzykład pokazujący sposób implementacji licznika odliczającego w dół.
Źródło: Java Sun Tutorial
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Map Trzy rodzaje implementacji Map:
HashMap TreeMap LinkedHashMap
Dwa słowniki są równe jeśli dla odpowiednich kluczy wartości ich są sobie równe.
Utworzenie obiektu słownika: Map<String, Integer> m = new
HashMap<String, Integer>(); Dostępne widoki: po przez klucz, po przez
wartości i po przez wartości oraz klucz. Iteracja może odbywać się wyłączenie po
przez widoki: for (KeyType key : m.keySet())
System.out.println(key); for (Map.Entry<KeyType, ValType> e
: m.entrySet()) System.out.println(e.getKey() + ": " + e.getValue());
public interface Map<K,V> { // podstawowe operacje V put(K key, V value); V get(Object key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // operacje zbiorcze void putAll(Map<? extends K, ? extends
V> m); void clear(); // konwersja public Set<K> keySet(); public Collection<V> values(); public Set<Map.Entry<K,V>> entrySet(); // interfejs dla elemtów entrySet public interface Entry { K getKey(); V getValue(); V setValue(V value); }}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Aplety Aplety są to programy, dla których
środowiskiem wykonawczym jest przeglądarka
Aplet musi być podklasą java.applet.Applet lub wersja java.applet.JApplet, w przypadku używania kontrolek Swing.
Aplet w początkach Javy pozwalał na łatwą dystrybucję programów, bez konieczności przeprowadzenia procesu instalacji.
Aplety wykonywane są w restrykcyjnym bezpiecznym obszarze (sandbox).
W prowadzenie Java Web Start zmniejszyło znaczenie apletów.
Umieszczanie apletów na stronie HTML
<applet code=AppletWorld.class width="200" height="200"></applet>
Możliwość wykonania apletu poza przeglądarką:
appletviewer AppletWorld.html Aplet standardowo uruchamiany i
zarządzany jest przez plug-in do przeglądarki.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Konwersja aplikacji do apletu
Aplikacja jest programem tzw. stand-alone, gdzie punktem wejścia jest funkcja main.
Aplet nie posiada metody main. Posiada kilka metod, które są wołane na różnych etapach wykonywania apletu
Kroki do przekształcenia aplikacji w aplet Utworzenie podklasy
java.applet.Applet Nadpisanie metody Init,
która inicjalizuje wykonanie apletu, podobnie jak main
Implementacja metody Init powinna uwzględniać fakt, że może być wołana wielokrotnie.
Elementy GUI w Aplecie dodawane są bezpośrednio do niego.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Cykl życia apletu
Ładowanie apletu Utworzenie instancji podklasy Applet Inicjalizacja apletu Uruchomienie apletu
Zatrzymanie apletu Aplet zostaje zatrzymany w przypadku, gdy użytkownik
opuszcza stronę z apletem. Wówczas wołana jest funkcja stop. Przeładowanie apletu
Jest wyjście z apletu i ponowne załadowanie apletu przez przeglądarkę
Przy wyjściu z apletu wołana jest funkcja stop oraz następuje zwolnienie zasobów
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Cykl życia apletu
Funkcje cyklu życia apletu init – inicjalizacja apletu. Powinien zawierać kod, który
normalnie umieszczany jest w konstruktorze, a umieszczane w nim metody powinny mieć krótki czas wykonywania.
start – jest wołana w celu uruchomienia apletu w przypadku gdy jest ładowany aplet bądź kiedy użytkownik powraca na stronę. W tej metodzie powinny zostać uruchomione wątki.
stop – zatrzymanie wykonywania apletu, w momencie gdy użytkownik opuszcza stronę bądź zamyka przeglądarkę.
destroy – zwolnienie zasobów, przygotowanie do wyłączenia apletu. Nie ma gwarancji, że metoda zostanie wykonana (!).
Nie każdy aplet wymaga nadpisania wszystkich metod
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Rysowanie
Rysowanie realizowane jest przez metodę paint
Applet dziedziczy metodę paint z AWT z klasy Container
public void paint(Graphics g) {g.drawRect(0, 0,
getWidth() - 1, getHeight() -
1);
g.drawString(buffer.toString(), 5, 15);
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Przechwytywanie zdarzeń
Aplet dziedziczy metody do obsługi zdarzeń z klasy ContainerprocessKeyEvent processMouseEventprocessEvent – przechwytuje każdy rodzaj
zdarzeń Przykład
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Komponenty UI Przycisk (javax.swing.JButton) Checkboxes (javax.swing.JCheckBox) Pojedyncza linia tekstu
(javax.swing.JTextField) Obszar tekstu (javax.swing.JTextArea) Etykieta (javax.swing.JLabel) Lista (javax.swing.JList) Okno wyskakujące tzw. pop-up
(javax.swing.Popup) Scrollbars (javax.swing.JScrollBar) Sliders (javax.swing.JSlider) Płótno – przestrzeń do rysowania
(java.awt.Canvas) Menu
(javax.swing.JMenu,javax.swing.JMenuBar javax.swing.JMenuItem, javax.swing.JCheckBoxMenuItem)
Kontenery (javax.swing.JPanel, javax.swing.JWindow and its subclasses)
Metody do zarządzania komponentami: add remove setLayout
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Bezpieczeństwo
Poziomy bezpieczeństwa dla danego apletu implementowane są niezależnie przez każdą przeglądarkę
Restrykcje nakładane przez aplety: Aplet nie może być ładować bibliotek, ani definiować natywnych metod Nie może standardowo czytać ani zapisywać plików na dysku
komputera, na którym jest wykonywany Nie może tworzyć połączenia poza komputerem, z które został pobrany Nie może uruchamiać programu, na komputerze, na którym jest
zainstalowany Nie może czytać właściwości systemu operacyjnego Wygląd okna apletu różni się od wyglądu okna aplikacji
Każda przeglądarka implementuje Security Manager, w którym można zmieniać moc ograniczeń. W przypadku, gdy SM uzna, że zostały naruszone ograniczenia, rzuci wyjątkiem SecurityException
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Wyświetlanie informacji w statusie
Możliwość wyświetlania informacji w pasku statusu showStatus("MyApplet: Loading image file " + file);
W pasku stanu nie powinny być wyświetlane krytyczne informacje. Warto natomiast wyświetlić informację na temat statusu ładowanych obrazków, źródeł, etc…
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Wyświetlanie dokumentów
Aplet oferuje możliwość wyświetlania sformatowanych dokumentów HTML
Do wyświetlania dokumentu służą poniższe metody wykonywane na AppletContext: public void showDocument(java.net.URL url) public void showDocument(java.net.URL url, String
targetWindow) Wartości dla parametru targetWindow: blank,
windowName, _self, _parent, _top
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Odtwarzanie dzwięków
JApplet oraz AudoClip znajdujące się w pakiecie java.applet umożliwiają odtwarzanie dźwięków w formacie: 8 bit, µ-law, 8000 Hz, mono, Sun ".au"
Tworzenie muzyki zapisanej w formacie .au umożliwia audiotool
getAudioClip(URL), getAudioClip(URL, String) – zwraca obiekt, który implementuje interfejs AudioClip
play(URL), play(URL, String) – odgrywa zasób umieszony pod wskazanym linkiem.
Interfejs AudioClip definiuje następujące metody: Loop – rozpoczyna ciągłe
odtwarzanie dzwięku. Play – odgrywa dźwięk
jednokrotnie Stop – zatrzymuje odtwarzanie
pliku
Przykład: http://java.sun.com/docs/books/tutorial/deployment/applet/sound.html
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Parametry