JAVA V Serializace Java, zimní semestr

Podobné dokumenty
JAVA. Ještě k funkcionálnímu programování (pokračování z předchozí přednášky)

JAVA. Ještě k funkcionálnímu programování (pokračování z předchozí přednášky)

JAVA. Odbočka: Návrhové vzory (Design patterns)

JAVA. Odbočka: Návrhové vzory (Design patterns)

JAVA. HTTP API (klient)

RMI Remote Method Invocation

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Úvod Virtuální kanál TCP Datagramová služba UDP URL TCP, UDP, URL. Fakulta elektrotechnická

JAVA V RMI Java, letní semestr

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

JAVA RMI Java, letní semestr 2018

Soubor jako posloupnost bytů

Remote Method Invocation RMI

Se vznikem internetu se můžeme na síťovou komunikaci v Javě (komunikace mezi více JVM) dívat dvěma pohledy-způsoby:

Programování v jazyku Java Java a Internet, základní pojmy, socketové x datagramové spojení, klient - server architektura.

Java a XML. 10/26/09 1/7 Java a XML

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Úvod do programovacích jazyků (Java)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

8. přednáška: Soubory a proudy

Iterator & for cyklus

Java Výjimky Java, zimní semestr

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Textové soubory. alg9 1

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Vytváření a použití knihoven tříd

Programování v Javě I. Únor 2009

GUI. Systémová integrace pro desktopové aplikace

UJO Framework. revoluční architektura beans. verze

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Typický prvek kolekce pro české řazení

Programování v Javě I. Leden 2008

RMI - Distribuované objekty v Javě

Úvod do programovacích jazyků (Java)

Teoretické minimum z PJV

1. Téma 12 - Textové soubory a výjimky

Úvod Jednoduchá komunikace Sockety Konec. Programování v C# Síťová komunikace. Petr Vaněček 1 / 33

PŘETĚŽOVÁNÍ OPERÁTORŮ

Java - řazení objektů

Z. Kotala, P. Toman: Java ( Obsah )

Algoritmizace a programování

Generické programování

Výčtový typ strana 67

Jini (pronounced GEE-nee) Cvičení 8 - DS 2006

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

typová konverze typová inference

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Java Enum Java, zimní semestr ,2017 1

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

20. Projekt Domácí mediotéka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Podmínky na zápočet. Java, zimní semestr

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

JAVA. Java Management Extensions JMX

6. PRÁCE S DATOVÝMI PROUDY

Tvorba informačních systémů

JAVA. Krátce o Reflection API

Programátorská příručka

Abstraktní třída a rozhraní

Seminář Java IV p.1/38

Vláknové programování část V

RMI - Remote Method Invocation

Seminář Java II p.1/43

JAVA JavaBeans Java, letní semestr

Čipové karty Lekařská informatika

Java Řetězce Java, zimní semestr

JAVA. Další jazyky kompilovatelné do Java byte-code

Principy objektově orientovaného programování

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Distribuované systémy a výpočty

Java - výjimky. private void vstup() throws IOException {... }

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java a národní prostředí

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

InputStream. FilterInputStream

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Výjimky. v C# a Javě

Programovací jazyk Java

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Regulární výrazy. Vzory

Práce se soubory v Javě

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

OOPR_05. Případové studie

KTE / ZPE Informační technologie

Transkript:

JAVA Serializace 1

Přehled "ukládání" celých objektů objekty "přežívají" mezi běhy programu persistence lightweight persistence explicitní ukládání a obnovování serializované objekty lze přenášet i po síti ukládá se stav objektu atributy kód třídy objektu musí být dostupný 2

Použití java.io.serializable prázdný interface serializovatelný objekt ho musí implementovat ObjectOutputStream potomek OutputStream implementuje DataOutput a ObjectOutput metoda void writeobject(object o) ObjectInputStream potomek InputStream implementuje DataInput a ObjectInput metoda Object readobject() 3

Příklad public class Data implements Serializable { private int d; public Data(int d) {this.d = d; public String tostring() { return super.tostring() + ", d=" +d;... Data data = new Data(1);... ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("file.dat")); out.writeobject(data);... ObjectInputStream in = new ObjectInputStream( new FileInputStream("file.dat")); data = (Data) in.readobject(); 4

Serializace serializují/deserializují se všechny atributy (i private) modifikátor atributu transient atribut se nebude ukládat neukládají se jen primitivní hodnoty ale i reference rekurzivně se ukládají i všechny objekty z atributů objektu při načítání se objekty vytvoří stejně provázané př. O1 Před serializací O1 Po deserializaci O2 O3 O2 O3 O4 O4 5

Vlastní serializace interface Externalizable rozšiřuje Serializable dvě metody void readexternal(objectinput in) void writeexternal(objectoutput out) objekty implementují Externalizable místo Serializable dál je vše stejné (téměř) modifikátor transient nemá žádný význam ukládání/načítání se provádí přes metody writeexternal a readexternal writeexternal a readexternal se volají automaticky 6

Příklad public class Data2 implements Externalizable { public Data2() { System.out.println("Data2"); public void writeexternal(objectoutput out) throws IOException { System.out.println("Data2.writeExternal"); public void readexternal(objectinput in) throws IOException, ClassNotFoundException { System.out.println("Data2.readExternal");... Data2 d = new Data2(); ObjectOutputStream o =... o.writeobject(d);... ObjectInputStream i =... d = (Data2) o.readobject(); 7

Nefunkční příklad public class Data3 implements Externalizable { Data3() { System.out.println("Data3"); public void writeexternal(objectoutput out) throws IOException { System.out.println("Data3.writeExternal"); public void readexternal(objectinput in) throws IOException, ClassNotFoundException { System.out.println("Data3.readExternal");... Data3 d = new Data3(); ObjectOutputStream o =... o.writeobject(d);... ObjectInputStream i =... d = (Data3) o.readobject(); // nastane výjimka!! 8

Načítání objektů implicitní serializace (implementování Serializable) při načítání objektů se nevolá konstruktor objekt se vytváří přímo vlastní serializace (implementování Externalizable) nejdřív se zavolá konstruktor základní konstruktor bez parametrů musí být dostupný pak se na objektu zavolá readexternal() 9

Vlastní serializace jiný postup implementovat interface Serializable přidat 2 magické metody private void writeobject(objectoutputstream stream)throws IOException; private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException obě metody musejí mít přesně dodržet danou hlavičku musejí být private v readobject() a writeobject() lze pomocí metod defaultreadobject() a defaultwriteobject() vyvolat implicitní uložení/načtení 10

Příklad public class Test implements Serializable { private String a; private transient String b; public Test(String aa, String bb) { a = "Not Transient: " + aa; b = "Transient: " + bb; private void writeobject(objectoutputstream stream) throws IOException { stream.defaultwriteobject(); stream.writeobject(b); private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException { stream.defaultreadobject(); b = (String)stream.readObject(); 11

Další magické metody private void readobjectnodata() throws ObjectStreamException volá se při načítání objektu, pokud některá z jeho tříd (třída a nadtřídy) není uložena ve streamu použití při změně hierarchie mezi uložením a načtením př: uložím objekt třídy Monkey, která dědí od Animal načítám objekt třídy Monkey, která dědí od Mammal a ta od Animal (metoda se použije na třídě Mammal) cokoliv Object readresolve() throws ObjectStreamException pokud metoda existuje, deserializace objektu dané třídy vrátí to, co tahle metoda cokoliv Object writereplace() throws ObjectStreamException pokud existuje, serializuje se to, co vrátí 12

serialversionuid cokoliv static final long serialversionuid = hodnota pokud při deserializaci nesouhlasí uložená hodnota s hodnotou ve třídě, vypadne InvalidClassException nemusí se používat vytvoří se automaticky při používání serializace explicitní deklarace se silně doporučuje 13

Serializace a std knihovna mnoho tříd ve standardních knihovnách implementuje Serializable pozor serializace nemusí fungovat mezi různými verzemi Javy obvykle varování v dokumentaci Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications... 14

JAVA Preference 15

Přehled balík java.util.prefs od JDK 1.4 určeno pro ukládání a načítání konfigurace programů automatické ukládání/načítání kam se ukládá, záleží na OS zvlášť pro každého uživatele pouze primitivní typy a řetězce (max. 8 KB dlouhé) dvojice klíč hodnota neimplementuje interface Map hierarchická struktura (strom) obvykle jen jeden uzel 16

Získání statické metody na třídě Preferences Preferences usernodeforpackage(class c) vrací uzel preferencí asociovaný s balíkem dané třídy Preferences systemnodeforpackage(class c) jako předchozí metoda společné pro všechny uživatele př: p = Preferences.userNodeForPackage(Foo.class) jméno uzlu ~ plný název balíku tečky se nahradí lomítky "/" 17

Příklad public class Prefs { public static void main(string[] args) { Preferences prefs = Preferences.userNodeForPackage(Prefs.class); prefs.put("url", "http://somewhere/"); prefs.putint("port", 1234); prefs.putboolean("connected", true); int port = prefs.getint("port", 1234); String[] keys = prefs.keys(); for (int i; i<keys.length; i++) { System.out.println(keys[i] + ": "+ prefs.get(keys[i], null)); 18

Metody String get(string key, String def) vrací hodnotu klíče musí se zadávat implicitní hodnota int getint(string key, int def) jako get postupně pro všechny typy void put(string key, String val) přiřadí klíči hodnotu definována i pro ostatní prim. typy String[] keys() vrací všechny klíče void flush() zapíše všechny změny 19

Metody void clear() smaže všechny preference v uzlu String name() jméno uzlu String absolutepath() absolutní jméno uzlu všechny metody jsou bezpečné vůči vláknům lze používat i z více JVM naráz 20

JAVA Komunikace po síti 21

Přehled balík java.net od JDK1.0 snadná komunikace po síti téměř jako používání souborů streamy po síti protokoly TCP a UDP Internet 22

java.net URI a URL 23

java.net.uri reprezentace URI unique resource identifier (RFC 2396) struktura URI [scheme:]scheme-specific-part[#fragment] absolutní URI obsahuje schema relativní URI nemá schema "opaque" URI specifická část nezačíná lomítkem př: mailto:java-net@java.sun.com news:comp.lang.java hierarchické URI buď absolutní URI začínající lomítkem nebo relativní URI př: http://java.sun.com/j2se/1.3/../../../demo/jfc/swingset2/src/swingset2.java 24

java.net.uri hierarchické URI - struktura [scheme:][//authority][path][?query][#fragment] authority [user-info@]host[:port] všechny části URI jsou typu String, pouze port je typu int normalizace URI odstranění a nahrazení "." a ".." 25

java.net.uri: metody String getscheme() String getschemespecificpart() String getpath() String gethost()... boolean isabsolute() boolean isopaque() void normalize() URL tourl() vytvoří URL z URI výjimka pokud nelze 26

java.net.url URL je specialní případ URI unique resource locator určování zdrojů na webu http://www.mff.cuni.cz/ podobné metody jako u URI get... InputStream openstream() otevře stream pro čtení souboru určeného pomocí URL URLConnection openconnection() vytvoří spojení na URL objekt 27

URLConnection reprezentace spojení mezi aplikací a URL použití 1. získání spojení (openconnection()) 2. nastavení parametrů např. setusecaches() 3. vytvoření spojení (connect()) vzdálený objekt se stane přístupný 4. získávání obsahu a informací obsah getcontent() hlavičky getheaderfield() streamy getinputstream(), getoutputstream() další getcontenttype(), getdate(),... 28

java.net Identifikace (DNS) 29

InetAddress reprezentuje IP adresu získání adresy statické metody na InetAddress InetAddress getbyname(string host) IP adresa pro dané jméno počítače pro null vrátí localhost InetAddress getbyaddress(byte[] addr) IP adresa pro danou adresu délka addr pole 4 pro IPv4, 16 pro IPv6 InetAddress getlocalhost() vrátí adresu pro localhost (127.0.0.1) 30

Příklad public class InetName { public static void main(string[] args) throws Exception { InetAddress a = InetAddress.getByName(args[0]); System.out.println(a); public class Localhost { public static void main(string[] args) throws Exception { System.out.println(InetAddress.getByName(null)); System.out.println(InetAddress.getLocalHost()); 31

java.net Sokety 32

Přehled soket = zakončení spojení TCP spolehlivá komunikace spojení jsou obousměrná lze získat IntputStream a OutputStream třída ServerSocket vytvoří "poslouchací" soket metoda accept() čeká na příchozí spojení vrátí soket pro komunikaci třída Socket soket pro komunikaci 33

Příklad: jednoduchý server public static void main(string[] args) throws IOException { ServerSocket s = new ServerSocket(6666); try { Socket socket = s.accept(); try { Reader in = new InputStreamReader( socket.getinputstream())); PrintWriter out = new PrintWriter(new OutputStreamWriter( socket.getoutputstream()), true); while (true) { String str = in.readline(); if (str.equals("end")) break; out.println(str); finally { socket.close(); finally { s.close(); 34

Příklad: jednoduchý klient public static void main(string[] args) throws IOException { InetAddress addr = InetAddress.getByName(null); Socket socket = new Socket(addr, 6666); try { Reader in = new InputStreamReader( socket.getinputstream()); PrintWriter out = new PrintWriter( new OutputStreamWriter( socket.getoutputstream()), true); for(int i = 0; i < 10; i ++) { out.println(i); String str = in.readline(); System.out.println(str); finally { socket.close(); 35

Obsluha příchozích požadavků předchozí příklad jednoduchý server obsluhuje jen jedno spojení obsluha více spojení pro každé příchozí spojení vytvořit vlákno channels a třída Selector obsluha více požadavků v jednom vláknu selektor drží množinu soketů metoda select() čeká dokud aspoň jeden soket není připraven k použití obdoba funkce select() na UNIX systémech 36

Vícevláknový server class ServeConnection extends Thread { private Socket socket; private Reader in; private PrintWriter out; public ServeConnection(Socket s) throws IOException { socket = s; in =...; out =...; start(); public void run() { while (true) { String str = in.readline(); if (str.equals("end")) break; out.println(str);... public class Server { public static void main(string[] args) throws IOException { ServerSocket s = new ServerSocket(6666); while(true) { Socket socket = s.accept(); new ServeConnection(socket); 37

java.net UDP 38

Přehled nespolehlivá komunikace třída DatagramSocket jak pro server tak pro klienta posílají/přijímají se datagramy void send(datagrampacket d) void receive(datagrampacket d) třída DatagramPacket datagram void setdata(byte[] buf) byte[] getdata() nastaví nebo vrátí bufer pro datagram int getlength() void setlength(int a) délka dat v datagramu 39

JAVA RMI (Remote Method Invocation) 40

Přehled balík java.rmi volání metod na vzdálených objektech "tváří se" jako lokální volání jen je pomalejší použití definice interface objektu interface musí rošiřovat interaface Remote všechny metody musí vyhazovat RemoteException implementace objektu klient používá objekt přes interface na straně klienta je "proxy" objekt, který předává volání přes sít na straně servru je "skeleton" objekt přijímá volání po síti a volá metody na objektu 41

Jednoduchý server public interface Hello extends Remote { void hello(string msg) throws RemoteException; public class HelloImpl implements Hello extends UnicastRemoteObject { public void hello(string msg) throws RemoteException { System.out.println(msg); public static void main(string[] args) { Hello h = new HelloImpl(); Naming.rebind("Hello", h); 42

Jednoduchý klient public class HelloClient { public static void main(string[] args) { Hello h = (Hello) Naming.lookup("Hello"); h.hello("ahoj"); Podrobně bude RMI v letním semestru 43

java.util Čas, datum 44

java.util.date reprezentace času s přesností na milisekundy od 1.1.1970 většina metod je deprecated od JDK1.1 nahrazeny třídou Calendar konstruktory Date() instance bude reprezentovat čas ve chvíli vytvoření objektu Data(long date) instance bude reprezentovat daný čas metody v podstatě jen na porovnávání boolean after(date d) boolean before(date d) int compareto(date d) ostatní metody jsou deprecated 45

java.util.calendar abstraktní třída jediný ne-abstract potomek GregorianCalendar statické atributy co lze zjišťovat a nastavovat YEAR, MONTH, DAY_OF_WEEK, DAY_OF_MONTH, HOUR, MINUTE, SECOND, AM_PM,... pro měsíce JANUARY, FEBRUARY,... pro dny v týdnu SUNDAY, MONDAY,... další AM, PM,... 46

java.util.calendar: metody získání instance statické metody getinstance() implicitní time zone getinstance(timezone tz) získání/nastavení času Date gettime() long gettimeinmillis() void settime(date d) void settimeinmillis(long t) porovnávání boolean before(object when) boolean after(object when) 47

java.util.calendar: metody získávání jednotlivých položek int get(int field) př. int day = cal.get(calendar.day_of_month) nastavování jednotlivých položek void set(int field, int value) př. cal.set(calendar.month, Calendar.SEPTEMBER) výsledný čas v milisekundách se přepočítá až při volání get(), gettime(), gettimeinmillis() přidávání k položkám void add(int field, int delta) pokud je třeba, upraví se i ostatní položky výsledný čas v milisekundách se přepočítá ihned přidávání k položkám bez zasahu do vyšších položek void roll(int field, int amount) void roll(int field, boolean up) 48

java.util.timezone reprezentace časového pásma bere v úvahu i letní/zimní čas získání timezone TimeZone getdefault() statická metoda vrátí timezone nastavenou v systému TimeZone gettimezone(string ID) vrátí požadovanou timezone možná ID String[] getavailableids() statická metoda ID jsou tvaru "America/Los_Angeles" GMT +01:00 49

Java java.time 50

java.time náhrada za Calendar od Java 8 Calendar není deprecated instance z java.time jsou obvykle nemodifikovatelné na rozdíl od instancí Calendar Instant okamžik na časové ose vytvoření static Instant now() static Instant ofepochmilli(long milli) static Instant parse(charsequence text) metody plus...(...), minus...(...), int get(temporalfield field) 51

java.time Duration doba mezi dvěma okamžiky př: Instant start = Instant.now();... Instant end = Instant.now(); Duration duration = Duration.between(start, end); vytvoření static Duration ofdays(long days) static Duration ofhours(long hours) static Duration ofminutes(long minutes) metody long todays() long tohours()... 52

java.time LocalDate LocalTime LocalDateTime datum/čas bez informace o časové zóně vytvoření (LocalDate LocalTime LocalDateTime).now() LocalDate.of(int year, int month, int dayofmonth)...of(...) metody plus, minus, get, ZonedDateTime datum a čas s časovou zónou zóna ZoneId 53

java.util Timer 54

Použití plánování úloh pro budoucí vykonání jednou nebo opakovaně úloha = TimerTask všechny úlohy nastavené v jednom Timer objektu se vykonávají jedním vláknem úloha by měla rychle skončit nastavení úlohy void schedule(timertask t, Date d) naplánuje úlohu na daný čas void schedule(timertask t, Date d, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním 55

Použití nastavení úlohy (pokr.) void schedule(timertask t, long delay) naplánuje úlohu na dobu aktuální čas + delay void schedule(timertask t, long delay, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním void scheduleatfixedrate(timertask t, Date d, long period) void scheduleatfixedrate(timertask t, long delay, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním relativně vzhledem k času prvního vykonaní 56

Použití metoda void cancel() zruší timer další naplánované úlohy se už neprovedou aktuálně prováděná úloha se dokončí lze volat opakovaně další volání nedělají nic třída TimerTask implementuje interface Runnable abstraktní třída nutno implementovat metodu run() další metody void cancel() zruší úlohu long scheduledexecutiontime() čas nejbližšího dalšího spuštění 57

java.util Localization 58

java.util.locale reprezentuje geografický, politický nebo kulturní region určuje, jak vypisovat texty, čísla, měnu, čas,... vytváření Locale(String language) Locale(String language, String country) Locale(String language, String country, String variant) př. new Locale("cs", "CZ") static Locale[] getavailablelocales() vrátí všechny nainstalované locales static Locale getdefault() vratí locale nastavený v systému 59

java.util.resourcebundle obsahuje "lokalizované" objekty např. řetězce bundly vždy patří do skupiny se společným základním jménem př. MyResources plné jméno bundlu = zákl. jméno + identifikace locale př. MyResources_cs, MyResources_de, MyResources_de_CH implicitní bundle pouze se základním jménem každý bundle ve skupině obsahuje stejné věci, ale "přeložené" pro daný locale pokud bundle pro požadovaný locale není, použije se implicitní bundle 60

ResourceBundle: použití získání bundlu ResourceBundle.getBundle("MyResources") ResourceBundle.getBundle("MyResources", currentlocale) bundle obsahuje dvojice klíč/hodnota klíče jsou pro všechny locale stejné, hodnota je jiná použití ResourceBundle rs = ResourceBundle.getBundle("MyResources");... button1 = new Button(rs.getString("OkKey")); button1 = new Button(rs.getString("CancelKey")); 61

ResourceBundle: použití klíče jsou vždy typu String hodnota je jakákoli získání objektu z bundlu String getstring(string key) String[] getstringarray(string key) Object getobject(string key) př: int[] ai=(int[])rs.getobject("intlist"); ResourceBundle abstraktní třída dvě implementace ListResourceBundle PropertyResourceBundle 62

ListResourceBundle abstraktní třída potomci musí definovat metodu Object[][] getcontents() public class MyResources extends ListResourceBundle { public Object[][] getcontents() {return contents; static final Object[][] contents = { {"OkKey", "OK", {"CancelKey", "Cancel", ; public class MyResources_cs extends ListResourceBundle { public Object[][] getcontents() {return contents; static final Object[][] contents = { {"OkKey", "OK", {"CancelKey", "Zrušit", ; 63

PropertiesResourceBundle není abstraktní při použití se nevytváří žádná třída lokalizované řetězce jsou v souborech jméno souboru základní jméno + locale + ".properties" př. myresources.properties myresources_cs.properties získání bundlu ResourceBundle.getBundle("myresources") formát souboru klíč=hodnota # komentář do konce řádku 64

Vlastní implementace potomek přímo od ResourceBundle předefinovat metody Object handlegetobject(string key) Enumeration getkeys() public class MyResources extends ResourceBundle { public Object handlegetobject(string key) { if (key.equals("okkey")) return "Ok"; if (key.equals("cancelkey")) return "Cancel"; return null; public class MyResources_cs extends ResourceBundle { public Object handlegetobject(string key) { // nemusí definovat všechny klíče if (key.equals("cancelkey")) return "Zrušit"; return null; 65

Java, zimní semestr Verze prezentace 2015 J09.cz.2015.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 66