400 likes | 598 Views
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)
E N D
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) • 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…
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 Strumienie wejściowe/wyjściowe źródło: http://java.sun.com/docs/books/tutorial/essential/io/streams.html
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 I n n X X a a n n Strumienie Bajtowe (byte streams) Strumień wejściowy in in.read() a int c = out.write(c) out Strumień wyjściowy
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
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
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 Formatowanie Więcej! http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax
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 Formatowanie zasady Specyfikator formatu Flaga Precyzja Liczba znaków Indeks argumentu Rodzaj konwersji Znak początku formatowania Przykład: System.out.format("%f, %1$+020.10f %n", Math.PI); 3.141593, +00000003.1415926536
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);
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)
Strumienie danych (data streams) • Wspierają bitową reprezentację podstawowych typów • Implementują interfejs DataInput lub DataOutput • Przykład: • Utworzenie strumienia do zapisu: • out = new DataOutputStream(newBufferedOutputStream(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(newBufferedInputStream(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
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.
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.
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 Strumienie plików
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.
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.
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 Interfejsy w 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. Interfejsy CF
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); } 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 Przechodzenie przez Collection public interface Iterator<E> { boolean hasNext(); E next(); void remove(); } Interfejs Polimorficzność kodu!!! static void filter(Collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); } Przykład
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); } Set
Podstawowe operacje na Set • Uwagi! • używaj typu Set zamiast konkretnego typu jak np. HashSet. Pozwoli to na elastyczniejsze programowanie po przez wykorzystanie polimorfizmu 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); } } Przykład Źródło: Java Sun Tutorial
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); } List
Podstawowe operacje na List • 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); } Przykład Uwagi! Powyższy przykład implementuje metodę zamiany miejscami dwóch wybranych elementów. 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); } Przykład Uwagi! Powyższy przykład pokazuje sposób wykonania iteracji wstecz.
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(); } Queue
Queue - przykład Przykład pokazujący sposób implementacji licznika odliczającego w dół. 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); } } } Przykład Źródło: Java Sun Tutorial
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); } } Map
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. Aplety
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. Konwersja aplikacji do apletu
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
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
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); } Rysowanie
Przechwytywanie zdarzeń • Aplet dziedziczy metody do obsługi zdarzeń z klasy Container • processKeyEvent • processMouseEvent • processEvent – przechwytuje każdy rodzaj zdarzeń • Przykład
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 Komponenty UI
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
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…
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
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 Odtwarzanie dzwięków Przykład: http://java.sun.com/docs/books/tutorial/deployment/applet/sound.html