No Slide Title

Слични документи
Microsoft PowerPoint - JavaP9_2019

3.Kontrlne (upravlja~ke) strukture u Javi

PowerPoint Presentation

Tutoring System for Distance Learning of Java Programming Language

Tutoring System for Distance Learning of Java Programming Language

Tutoring System for Distance Learning of Java Programming Language

Mrežno računarstvo

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

PowerPoint Presentation

Slide 1

Razvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić

P11.3 Analiza zivotnog veka, Graf smetnji

Uvod u računarstvo 2+2

PROMENLJIVE, TIPOVI PROMENLJIVIH

Класе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности подата

Microsoft Word - IP_Tables_programski_alat.doc

PHP kod

Primenjeno programiranje - vezbe GUI i baze podataka

Mrežno računarstvo

Microsoft Word - Java_introduction_NEW_SYLLABUS.doc

Programski jezici i strukture podataka

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

Programiranje 2 popravni kolokvij, 15. lipnja Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanj

VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr

PHP proširenja za rad sa bazama podataka Postoje pojedinačna proširenja za različite tipove baza podataka sa svojim bibliotekama funkcija npr. postoji

Microsoft PowerPoint - Datoteke [Compatibility Mode]

Slide 1

PowerPoint Presentation

Uvod u računarstvo 2+2

Funkcije predavač: Nadežda Jakšić

12 Stanje

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

Programski jezik C

Funkcije predavač: Nadežda Jakšić

Projekti šabloni

Рачунарска интелигенција

Microsoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]

Писање и превођење модула

Slide 1

Test ispravio: (1) (2) Ukupan broj bodova: 21. veljače od 13:00 do 14:00 Županijsko natjecanje / Osnove informatike Osnovne škole Ime i prezime

Tutoring System for Distance Learning of Java Programming Language

Programiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4

Podela ra~unarskih sredtava

Računarski praktikum I - Vježbe 07 - Podstrukture, const, reference

Sveucilište u Zagrebu

Računarski praktikum I - Vježbe 03 - Implementacija strukture string

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - 07-DinamickeStrukturePodataka

P9.1 Dodela resursa, Bojenje grafa

UPUTSTVO ZA KRETANJE KROZ EON KORISNIČKI INTERFEJS 1

PowerPoint Presentation

Microsoft Word - CAD sistemi

PowerPoint Presentation

Microsoft Word - 11 Pokazivaci

Programiranje u C-u ili C++-u Pseudo-slučajni brojevi; Dinamička alokacija memorije 1 ZADACI SA ČASA Zadatak 1 Napraviti funkciju koja generišlučajan

Увод у организацију и архитектуру рачунара 1

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

KATALOG ZNANJA IZ INFORMATIKE

Zadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { } public static void main(string[] args) { obrada(2.71

UVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke o

Računarski praktikum I - Vježbe 01 - Uvod

Programiranje za UNIX Okruženje unix procesa

Programiranje 1 drugi kolokvij, 2. veljače Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanje,

23. siječnja od 13:00 do 14:00 Školsko natjecanje / Osnove informatike Srednje škole RJEŠENJA ZADATAKA S OBJAŠNJENJIMA Sponzori Medijski pokrovi

1 NOVO U MNG CENTRU!!! OVLADAJTE TEHNOLOGIJOM IZRADE JAVA EE APLIKACIJA KORIŠ C ENJEM ORACLE ADF-A O - Otkrijte brzinu razvoja aplikacija sa ADF-om -

PuTTY CERT.hr-PUBDOC

1, 2, 3, кодирај! Активности циклуса 4 Пројект «Аркадне игре» - Час 6: Програмирање падања новчића (наставак) Доминантна дисциплина Математикa Резиме

PowerPoint Presentation

COMARC/A Format

Дистрибуирани софтверски системи Технички факултет "Михајло Пупин" Зрењанин, Универзитет у Новом Саду Практикум за лабораторијске вежбе #05 [нерецензи

Uvod u računarstvo 2+2

Microsoft PowerPoint - PRI2014 KORIGOVANO [Compatibility Mode]

Microsoft PowerPoint - 6. CMS [Compatibility Mode]

Zbirka resenih zadataka iz arhitekture racunara

Slide 1

PowerPoint Presentation

Microsoft PowerPoint - 12-Funkcije_1.ppt [Compatibility Mode]

Дистрибуирани софтверски системи Технички факултет "Михајло Пупин" Зрењанин, Универзитет у Новом Саду Практикум за лабораторијске вежбе #07 [нерецензи

Microsoft PowerPoint - 10-Jednodimenzionalni nizovi.ppt [Compatibility Mode]

УПУТСТВО ЗА КОРИСНИКА Приступ локацији часописа Српски архив за целокупно лекарство добија се преко internet adrese: Након

Datoteke predavač: Nadežda Jakšić

Projektovanje informacionih sistema i baze podataka

PDO

Računarski praktikum I - Vježbe 09 - this, static

Otvoreno računarstvo o 4. laboratorijska vježba o Java Igor Čavrak

Microsoft Word - MySQL_3.doc

Programiranje 1 5. predavanje dodatak Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2018, 5. predavanj

1. OPĆE INFORMACIJE 1.1. Naziv kolegija Programiranje 1.6. Semestar Nositelj kolegija dr.sc. Bruno Trstenjak, v. pred Bodovna vrijednost

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

PowerPoint Presentation

Microsoft PowerPoint - 01 Uvod u operativne sisteme.ppt

Često postavljana pitanja u programu OBRT 1. Kako napraviti uplatu u knjizi tražbina i obveza? 2. Kako odabrati mapu/disk za pohranu podataka? 3. Kako

Microsoft Word - KORISNIČKA UPUTA za pripremu računala za rad s Fina potpisnim modulom_RSV_ doc

Studijski primer - Dijagrami toka podataka Softverski inženjering 1

1 jmbag ime i prezime Programiranje 2 prvi kolokvij, Rezultati i uvidi u kolokvije: Rezultati u petak, 3.5., navečer na webu, a uvidi u p

Osnovi programiranja Beleške sa vežbi Smer Računarstvo i informatika Matematički fakultet, Beograd Jelena Tomašević i Sana Stojanović November 7, 2005

Транскрипт:

Објектно орјентисано програмирање Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs

Улаз и излаз, серијализација Владимир Филиповић Александар Картељ kartelj@matf.bg.ac.rs

Токови, читачи и писачи 3/69 Улаз и излаз у Јави су (исто као и мрежна и веб комуникација) реализоване преко токова података. Основу чине две апстрактне класе: InputStream и OutputStream. Улаз и излаз се у овом случају организују преко тока бајтова. Поступак је да се креира ток, који ће приликом позива конструктора бити придружен датотеци, конзоли или мрежном порту, а улазно/излазне операције се реализују позивима одговарајућих метода над тако креираним током. Скоро сви улазно-излазни методи могу генерисати изузетке, па они обично у декларацији садрже throw IOException.

4/69 Токови, читачи и писачи (2) Поред токова података, за улаз и излаз се још користе читачи и писачи. Основу чине две апстрактне класе: 1. Reader 2. Writer Поступак је да се креира читач/писач, који ће приликом позива конструктора бити придружен датотеци, конзоли или мрежном порту. Улазно/излазне операције се реализују позивима одговарајућих метода над креираним читачем/писачем.

Токови, читачи и писачи (3) 5/69 Дијаграм који следи приказује односе наслеђивања између токова података, читача и писача.

6/69 Токови, читачи и писачи (4) Како су InputStream и OutputStream апстрактне класе, то се улаз/излаз обично реализује преко њихових поткласа, као што су: FileInputStream, FileOutputStream DataInputStream и DataOutputStream. Наравно, често се користе и друге поткласе ових класа чиме се нпр. омогућава филтерисање и/или баферисан улаз/излаз. Како су Reader и Writer апстрактне класе, то се улаз/излаз обично реализује преко њихових поткласа, као што су: InputStreamReader, InputStreamWriter FileReader, FileWriter.

7/69 Токови, читачи и писачи (5) Токови који су већ коришћени у ранијим програмима су: System.in и System.out, примерци класа InputStream и PrintStream. Стандардни излазни ток System.out је већ отворен и спреман за прихватање података. Обично овај ток одговара излазу конзоле или другом одредишту за излаз који је одредило окружење домаћина. Стандардни улазни ток System.in је већ отворен и спреман за прихват улазних података. Обично овај ток одговара улазу са тастатуре или неком другом улазном извору који је одредило Јава окружење домаћина, односно корисник.

Улазни токови података 8/69 Основни метод у класи InputStream је метод read. Тај метод чита један бајт (број 0-255). Ако се при читању препозна крај тока, метод враће -1. Потпис овог метода је: public abstract int read() throws IOExeption Улазне операције обично не реализују директним позивима метода read, већ се користе други објекти, нпр. објекти типа Scanner. Методи за читање низа бајтова (ни они се директно не позивају много често): public int read(byte b[]) throws IOException public int read(byte b[], int pocetak, int duzina) throws IOException

Улазни токови података (2) 9/69 Улазне операције реализоване преко класе InputStream су операције тзв. ниског нивоа. Рад на том нивоу није атрактиван ни ефикасан (са тачке гледишта типичног програмера) па је развијен велики број поткласа за организацију улаза специјалних врста података. Дакле, улаз се обично организује преко поткласа као што су: FileInputStream, FilterInputStream, ByteArrayInputStream, ObjectInputStream итд.

Улазни токови података (3) 10/69 Следећи дијаграм приказује поткласе класе InputStream:

Излазни токови података 11/69 У класи OutputStream најчешће се користи метод write. Слично као и у претходном случају, излазне операције се обично не реализују директним позивима метода write. public abstract void write(int b) throws IOException public void write(byte b[]) throws IOException public void write(byte b[], int offset, int len) throws IOException Метод flush служи за пражњење излазног бафера: public void flush() throws IOException Метод close затвара излазни ток података, чиме се омогућује боље коришћење ресурса: public void close() throws IOException

Излазни токови података (2) 12/69 Излазне операције реализоване преко класе OutputStream су операције тзв. ниског нивоа. Рад на том нивоу није атрактиван ни ефикасан (са тачке гледишта типичног програмера) па је развијен велики број поткласа за организацију излаза специјалних врста података. Дакле, излаз се обично организује преко поткласа као што су: FileOutputStream, FilterOutputStream, ByteArrayOutputStream, ObjectOutputStream итд. Наравно, у овим класама се по потреби редефинишу методи класе OutputStream, али се уводе и нови методи.

Излазни токови података (3) 13/69 Следећи дијаграм приказује поткласе класе OutputStream:

Читачи 14/69 Основни метод у класи Reader је метод read. Тај метод чита један цео број који представља код Unicode знака. Ако се при читању препозна крај улаза, метод враће -1. Потпис овог метода је: public abstract int read() throws IOExeption Поред метода read, у овој класи су дефинисани и методи: skip, ready, mark, reset и close.

Читачи (2) 15/69 Следећи дијаграм приказује поткласе класе Reader:

Писачи 16/69 Метод write у класи Writer je такође преоптерећен: public abstract void write(byte b) throws IOException public void write(char cbuf[]) throws IOException abstract public void write(char cbuf[], int off, int len) throws IOException public void write(string str) throws IOException public void write(string str, int off, int len) throws IOException Ту су још следећи методи: Метод append служи за додавање знака/знакова у писач; Метод flush служи за пражњење излазног бафера писача; Метод close затвара писач, чиме се омогућује боље коришћење ресурса.

Писачи (2) 17/69 Следећи дијаграм приказује поткласе класе Writer:

Уланчавање токова 18/69 У Јави се користи паметан механизам за раздвајање две врсте одговорности. Наиме, неки токови као што су FileInputStream могу да прибаве бајтове из датотека или из других егзотичних локација. Други токови као што су DataInputStream и PrintWriter могу од бајтова да склопе корисније типове података. Јава програмер само треба да комбинује ове два функционалности.

Уланчавање токова (2) 19/69 На пример, да би се могао прочитати реалан број из датотеке, прво треба креирати примрак класе FileInputStream и потом га проследити конструктору класе DataInputStream. FileInputStream fin = new FileInputStream("employee.dat"); DataInputStream din = new DataInputStream(fin); double s = din.readdouble();

Уланчавање токова (3) 20/69 Програмер може, додатним уланчавањем, тј. угњежђавањем филтера, додати више способности. На пример, токови нису баферисани. То значи да читају бајт по бајт. Ефикасније је да се захтева блок података и да се они сместе у бафер: DataInputStream din = new DataInputStream( new BufferedInputStream( new FileInputStream("employee.dat")));

Уланчавање токова (4) 21/69 Читање бројева из компресоване ZIP датотеке може да се постигне на следећи начин: ZipInputStream zin = new ZipInputStream(new FileInputStream("employee.zip")); DataInputStream din = new DataInputStream(zin);

Датотеке и директоријуми 22/69 Подаци у спољашњој меморији рачунарског система су обично организовани у виду датотека и директоријума. Датотека представља колекцију података који чине једну логичку целину, а директоријуми (каталози) служе за груписање датотека. У програмском језику Јава, за рад са датотекама и директоријумима се користи класа File.

Рад са File објектима 23/69 Примерак класе File заправо не представља датотеку, већ енкапсулира путању до нечега што може, а не мора бити датотека или директоријум. File објекат са путањом до неке датотеке или директоријума не значи да сама та датотека или директоријум постоји. Често се дефинише File објекат који енкапсулира путању до нове датотеке или новог директоријума који ће тек касније да буде креиран.

Креирање File објеката 24/69 У класи File постоје четири конструктора. Први очекује као аргумент стринг са путањом фајла или директоријума: File mydir = new File("C:/jdk1.5.0/src/java/io"); File mydir = new File("C:\\jdk1.5.0\\src\\java\\io"); Следећа два конструктора омогућују да се одвојено задају родитељски директоријум и име датотеке: File mydir = new File("C:/jdk1.5.0/src/java/io"); File myfile = new File(myDir, "File.java"); File myfile = new File("C:/jdk1.5.0/src/java/io", "File2.java");

25/69 Креирање File објеката (2) Последњи, четврти конструктор, омогућује креирање File објекта од објекта типа URI (енг. uniform resource identifier), који енкапсулира униформни идентификатор ресурса на вебу. File remotefile = new File( new URI("http://www.wrox.com/misc-pages/booklist.shtml"));

26/69 Апсолутне и релативне путање Приликом рада са File објектима, могу се користити и апсолутне и релативне путање. Пример коришћења релативе путање: File myfile = new File("output.txt"); Путања је релативна у односу на текући директоријум па се датотека "output.txt" налази у директоријуму где је и програм.

Тестирање File објеката 27/69 Класа File садржи преко тридесет метода. Информације о самом File објекту могу се добити следећим методима: 1) Испитивање објеката getname( ) враћа име датотеке, не укључујући путању. Ако објекат представља директоријум, враћа само име директоријума getpath( ) враћа путању, укључујући име датотеке или директоријума getabsolutepath( ) враћа апсолутну путању датотеке, односно директоријума реферисаног текућим File објектом. isabsolute( ) враћа true ако је путања апсолутна, false иначе getparent( ) враћа име родитељског директоријума (за датотеку или директоријум).

28/69 Тестирање File објеката (2) getparentfile( ) враћа родитељски директоријум као File објекат или null ако не постоји родитељ. tostring( ) враћа исту ниску исти као getpath( ) equals( ) метод се користи за поређење два File објекта. Пореде се путање. 2) Испитивање датотека и директоријума exists( ) isdirectory( ) isfile( ) ishidden( ) canread( ) canwrite( ) за овај и претходне методе јасно је из имена када враћају true, односно false.

29/69 Тестирање File објеката (3) 3) Добијање додатних информација о датотеци или директоријуму list() ако текући File објекат представља директоријум, метод враћа низ ниски са именима чланова директоријума иначе враћа null ако је објекат датотека. listfiles() Ако је текући објекат директоријум, враћа низ File објеката који одговарају датотекама и директоријумима у том директоријуму. length() враћа вредност типа long, која је дужина, у бајтовима, датотеке на коју реферише текући File објекат. Ако се ради о датотеци који не постоји, враћена дужина биће 0. Ако објекат реферише на директоријум, није дефинисано шта је повратна вредност метода.

Тестирање File објеката (4) 30/69 lastmodified() враћа вредност типа long, која представља време када је датотека или директоријум реферисан текућим објектом последњи пут измењен. Време је изражено бројем милисекунди протеклих од поноћи 1. јануара 1970. по Гриничу. listroots() Статички метод класе Filе враћа низ Filе објеката, при чему сваки елемент у низу одговара кореном директоријуму текућег система датотека. Путања сваке од датотека у систему почиње неким од корених директоријума. На Unix систему враћени низ имаће само један елемент који одговара једином кореном директоријуму /. Под Windows-ом, низ садржи по елемент за сваки логички уређај који имамо, укључујући floppy, CD, DVD.

Тестирање File објеката (5) 31/69 4) Филтрирање листе Постоје и верзије метода list и listfiles класе File које очекују аргумент за филтрирање листе. Пример. Траже се све датотеке/директоријуми чија имена почињу словом Т. Аргумент који се прослеђује методу list мора бити типа FilenameFilter, док метод listfiles прихвата аргумент типа FilenameFilter или FileFilter.

32/69 Тестирање File објеката (6) И FilenameFilter и FileFilter су интерфејси који садрже апстрактни метод accept. public interface FilenameFilter { } public abstract boolean accept(file directory, String filename); public interface FileFilter { } public abstract boolean accept(file pathname); Филтрирање листе коју враћају list и listfiles врши се тако што се за сваки елемент листе позива метод accept објекта прослеђеног као аргумент метода list, односно listfiles. Ако accept врати true, елемент остаје у листи, а иначе се искључује из ње.

33/69 Тестирање File објеката (7) 5) Креирање и модификовање датотека и директоријума renameto(file path) датотека-директоријум реферисан текућим објектом бива преименован у складу са аргументом. Датотека/директоријум на који реферише текући објекат, након овога више не постоји, јер сада има ново име, а можда је и у другом директоријуму. setreadonly() враћа true ако је операција успела

34/69 Тестирање File објеката (8) mkdir() креира директоријум са путањом одређеном текућим објектом. Метод не успева ако родитељски директоријум не постоји. Враћа true ако је операција успела. mkdirs() за разлику од претходног, креира неопходне родитељске директоријуме. Враћа true ако је операција успела. Чак и ако операција не успе, могуће је да су креирани неки од родитељских директоријума. createnewfile() креира нову празну датотеку са путањом задатом текућим објектом, ако такав не постоји. Метод креира датотеку само у постојећем директоријуму (не креира директоријуме одређене путањом). Враћа true ако је успео. createtempfile() статички метод који креира привремени фајл у задатом директоријуму (трећи аргумент), са именом које одређују прва два аргумента метода. При томе, први аргумент одређује почетни део имена фајла, а други његову екстензију.

35/69 Тестирање File објеката (9) delete() брише датотеку/директоријум представљен текућим објектом и враћа true ако је брисање успело. Не брише директоријуме који нису празни. Да би се обрисао директоријум, најпре се мора обрисати сав његов садржај. deleteonexit() датотека/директоријум представљен текућим објектом биће избрисан по завршетку рада програма. Метод нема повратну вредност. Брисање ће бити покушано само ако се JVM заврши нормално. Једном када се овај метод позове за File објекат, операција је неповратна. Датотеке који се креирају коришћењем метода createtempfile нису нужно привремени јер се не бришу аутоматски. Стога се мора користити delete или deleteonexit како би се уклониле датотеке које више нису потребне.

Класа Scanner 36/69 Користи се за парсирање примитивних типова и стрингова. Раставља свој улаз на делове (токене) при чему за подразумеванe знаке раздвајања сматра белине (, \n, \t, итд.). Примерак класе Scanner може читати из ма ког објекта који имплементира интерфејс Readable. Резултујући токени се могу конвертовати у вредности различитих типова користећи разне варијанте next методе. Пример. Читање наредног целог броја из тока System.in: Scanner sc = new Scanner(System.in); int i = sc.nextint();

Класа Scanner (2) 37/69 Пример.Читање целих бројева типа long из дате датотеке, све док их има: Scanner sc = new Scanner(new File( mynumbers )); while( sc.hasnextlong() ) long along=sc.nextlong(); Пример. Читање из ниске: String input = 1 2 java san ; Scanner s = new Scanner(input); System.out.println(s.nextInt()); // 1 System.out.println(s.nextInt()); // 2 System.out.println(s.next()); // java System.out.println(s.next()); // san

Класа Scanner (3) 38/69 java.util.scanner usedelimiter() поставља друге знаке као знаке раздвајања при парсирању регуларних израза (уместо белина). next() nextint() nextxxx() (где је XXX име примитивног типа Boolean, Double, Float,...) најпре прескачу знакове раздвајања, а затим парсирају наредни токен и покушавају да врате вредност циљног типа која одговара парсираном токену. hasnext() hasnextint() hasnextxxx() (где је XXX име примитивног типа Boolean, Double, Float,...) најпре прескачу знакове раздвајања, а затим парсирају наредни токен и покушавају да враћају true уколико парсирани токен представља вредност циљног типа. У супротном враће false.

Класа Scanner (4) 39/69 java.util.scanner public Scanner(InputStream source) public Scanner(File source) public Scanner(String source) креира објекат типа Scanner на основу задатог аргумента. public boolean hasnext(); враћа true ако постоји наредни токен на улазу. public String next(); проналази и враће цео наредни токен. Цео токен је окружен знацима раздвајања (и испред токена и иза њега су знаци за раздвајање). public boolean hasnext(string pattern); враће true ако наредни токен одговара обрасцу pattern. public String next(string pattern); враће наредни токен ако он одговара обрасцу pattern. public boolean hasnextline(); враће true ако постоји следећа линија на улазу. public String nextline(); враће остатак текуће линије искључујући ознаку за крај реда са њеног краја.

Серијализација 40/69 Серијализација је процес писања објеката у датотеку и читања објеката из датотеке. Поступак је веома једноставан. Неопходно је да класа објеката које треба писати у датотеку или читати из датотеке имплементира интерфејс Serializable. У већини случајева довољно је само декларисати да класа имплементира овај интерфејс и није неопходан никакав додатни код.

Серијализација (2) 41/69 Уколико постоје чланови тј. поља објекта који су референце на објекте неких других класа, те друге класе такође морају имплементирати интерфејс Serializable и онда ће се њихова серијализација вршити аутоматски. Писање објеката у датотеку обавља се позивом метода writeobject за објекат типа ObjectOutputStream. При том треба предузети мере да се ухвате изузеци који могу бити избачени.

Серијализација (3) 42/69 Пример. Фрагмент кода који креира ObjectOutputStream објекат и пише објекат imenik типа HashMap<Osoba,Unos> у датотеку "C:\temp\Imenik.bin": try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( new File("C:/temp/Imenik.bin"))); out.writeobject(imenik); out.close(); } catch (IOException e) { } e.printstacktrace(); System.exit(1);

Серијализација (4) 43/69 Следећи дијаграм показује објектни граф (лево) и начин на који ови објекти бивају серијализовани (десно).

Серијализација (5) 44/69 Читање објеката из датотеке (десеријализација) је подједнако једноставно као и писање у датотеку. Креира се ObjectInputStream објекат за читање из жељене датотеке, а потом се објекти из те датотеке читају позивима метода readobject. Метод readobject враћа референцу на прочитани објекат као вредност типа Object, па је неопходно извршити експлицитну конверзију (кастовање) у одговарајући тип објекта. Низови у Јави такође представљају објекте, па се правило о кастовању односи и на њих.

Серијализација (6) 45/69 Пример. Фрагмент кода који следи креира примерак класе ObjectInputStream и чита објекат типа HashMap<Osoba,Unos> из датотеке "C:\temp\Imenik.bin": try { ObjectInputStream in = new ObjectInputStream( new FileInputStream( new File("C:/temp/Imenik.bin"))); imenik = (HashMap<Osoba, Unos>) in.readobject(); in.close(); } catch (ClassNotFoundException e) { e.printstacktrace(); System.exit(1); } catch (IOException e) { e.printstacktrace(); System.exit(1); }

Напредна серијализација 46/69 Следећи услови који морају бити испуњени како би се серијализација објеката класе одвијала аутоматски: 1. класа мора бити public; 2. мора имплементирати интерфејс Serializable; 3. ако има атрибуте који су класних типова, ти типови такође морају имплементирати Serializable интерфејс; 4. наткласе морају имплементирати Serializable интерфејс; 5. класе чланова морају имплементирати Serializable интерфејс; 6. у случају да постоји наткласа која не имплементира Serializable интерфејс, она мора имати public подразумевани конструктор, а класа која се серијализује се мора побринути о прослеђивању чланица те наткласе у излазни ток.

Проблеми код серијализације 47/69 За већину класа и примена, серијализација тече праволинијски. Међутим, конфузија може настати приликом покушаја писања у датотеку неколико верзија истог објекта. Наиме, процес серијализације прати који објекти су уписани у ток и сваки покушај поновног писања објекта не резултује стварним писањем дупликата објекта, већ се у ток уписује само референца која указује на прву појаву објекта у току.

Проблеми код серијализације (2) Компликације настају када се дефиниција класе на неки начин промени између писања и читања објекта. 48/69 Приликом писања објекта у датотеку, уписује се и информација која идентификује класу, тзв. идентификатор верзије, односно вредност статичког поља serialversionuid. Ова информација служи како би се проверило да је дефиниција класе која се користи приликом читања објекта из датотеке компатибилна са оном која је коришћена приликом његовог уписа.

Проблеми код серијализације (3) Промене између писања и читања, могу променити идентификатор верзије, због чега операција читања не успева, па долази до избацивања изузетка типа InvalidClassException. Промене које најчешће доводе до некомпатибилности су: 1. брисање поља 2. померање класе навише или наниже кроз хијерархију 3. промена поља из нестатичког у статичко 4. промена типа поља Компатибилне промене су: 1. додавање поља 2. промена приступних атрибута поља (public, private...) 3. промена поља из статичког у нестатичко 49/69

50/69 Захвалница Велики део материјала који је укључен у ову презентацију је преузет из презентације коју је раније (у време када је он држао курс ) направио проф. др Душан Тошић. Хвала проф. Тошићу што се сагласио са укључивањем тог материјала у садашњу презентацији, као и на помоћи коју ми је пружио током конципцирања и реализације курса. Надаље, један део материјала је преузет од колегинице Марије Милановић. Хвала Марији Милановић на помоћи у реализацији ове презентације.