seminarski rad objectinputstream

18
Veleučilište u Rijeci Stručni studije poslovne informatike Seminarski rad Klasa ObjectInputStream

Upload: vedran-sevrovic

Post on 10-Jul-2016

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Seminarski Rad ObjectInputStream

Veleučilište u RijeciStručni studije poslovne informatike

Seminarski rad

Klasa ObjectInputStream

Student: Goran ČurčićMentor: Ivan PogarčićPredmet: Objektno orijentirane tehnologije I

Rijeka, veljača 2008.

Page 2: Seminarski Rad ObjectInputStream

Sadržaj

Sadržaj.....................................................................................................................................2Uvod..........................................................................................................................................3

java.io Class BufferedWriter..................................................................................................3Članovi klase BufferedWriter..........................................................................................4

Polja ( Fields ).........................................................................................................................4Konstruktori ( Constructors )..................................................................................................5

BufferedWriter....................................................................................................................5BufferedWriter....................................................................................................................5

Metode ( Methods ).................................................................................................................5write....................................................................................................................................5write....................................................................................................................................6writer...................................................................................................................................6newLine...............................................................................................................................7flush.....................................................................................................................................7close....................................................................................................................................7

Klasa Writer..........................................................................................................................8java.io Class Writer.................................................................................................................8Polja( Fields )..........................................................................................................................9

lock......................................................................................................................................9Konstruktori ( Constructors )..................................................................................................9

Writer..................................................................................................................................9Writer..................................................................................................................................9

Metode ( Methods ).................................................................................................................9write....................................................................................................................................9write..................................................................................................................................10write..................................................................................................................................10write..................................................................................................................................10write..................................................................................................................................11flush...................................................................................................................................11close..................................................................................................................................11

Primjeri korištenja klase BufferedWriter................................................................12BufferedWriter: close().........................................................................................................12Primjer zapisivanja teksta u file............................................................................................12

Page 3: Seminarski Rad ObjectInputStream

Uvod

java.io Class ObjectInputStream

java.lang.Objectjava.io.InputStream

java.io.ObjectInputStream

Klasa ObjectInputStream deserijalizira primitivne podatke i objekte prethodno zapisane koristeći ObjectOutputStream.

ObjectInputStream i ObjectOutputStream mogu ponuditi aplikaciju sa stalnom pohranom ta grafikone objekata kada su korišteni sa klasom FileOutputStream odnosno FileInputStream. ObjectInputStream se koristi kako bi obnovila ove objekte prethodno serijalizirane. Druga korištenja uključuju prijenos objekata između hostova koristeći socket tok ili za raspoređivanje i deraspoređivanje argumenata i parametara u daljinskom komunikacijskom sistemu.

ObjectInputStream osigurava da tipovi svih objekata u grafikonu koji je kreiran od toka odgovaraju klasama prezentiranim u Java Virtual Machine. Klase su učitane kao potrebne koristeći standardan mehanizam.

Samo objekti koji podržavaju java.io.Serializable ili java.io.Externalizable sučelje mogu biti čitane iz toka.

Metoda readObject se koristi za čitanje objekta iz toka. Javin sigurni odljevak trebao bi biti korišten kako bi se dobio željeni tip.

Primitivni tipovi podataka mogu biti čitani iz toka koristeći odgovarajuću metodu u DataInput-u.

Standardni mehanizmi deserijalizacije objekta obnavljaju sadržaj svakog polja u vrijednost i tip koji ima kad je bio zapisan. Polja deklarirana kao privremena ili statična su ignorirana u procesu deserijalizacije. Reference prema drugim objektima uzrokuju da ti objekti budu čitani iz toka kad je potrebno. Grafikoni objekata su točno obnovljena koristeći referentni dijeljeni mehanizam. Novi objekti su uvijek alocirani kada je deserijalizacija, što štiti postojeće objekte da budu prepisani.

Čitanje objekta je analogno kao pokretanje konstruktora za novi objekt. Memorija je alocirana za objekt i inicijalizirana na nulu. No-arg konstruktor je pozvan za ne-serijalizirane klase i

Page 4: Seminarski Rad ObjectInputStream

tada polja od serijaliziranih klasa su obnovljena iz toka startajući sa serijaliziranom klasom najbližom do java.lang.object i završno sa najviše specifičnom klasom objekta.

Na primjer za čitanje iz toka koji je zapisan u primjeru ObjectOutputStream:

FileInputStream fis = new FileInputStream("t.tmp");ObjectInputStream ois = new ObjectInputStream(fis);

int i = ois.readInt();String today = (String) ois.readObject();Date date = (Date) ois.readObject();

ois.close();

Klase kontroliraju kako su serijalizirane implementirajući ili java.io.Serializable ili java.io.Externalizable sučelje.

Implementirajući Serializable sučelja dopušta objektu serijalizacije da spremi i obnovi cijelo stanje objekata i dopušta klasama da se razviju između vremena kad je tok zapisan i vremena kad je čitan. Automatski poprečuje reference između objekata, spremajući i obnavljajući cijele grafikone.

Serijalizacijske klase koje zahtijevaju specijalno korištenje dok kroz proces serijalizacije i deserijalizacije trebale bi implementirati sljedeće metode:

private void writeObject(java.io.ObjectOutputStream stream) throws IOException; private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void readObjectNoData() throws ObjectStreamException;

ReadObject metoda je odgovorna za čitanje i obnavljanje stanja objekta za njegovu određenu klasu koristeći podatak zapisan u tok odgovarajućom writeObject metodom. Metoda ne treba voditi brigu da stanjem koje pripada njegovim super-klasama ili podklasama. Stanje je obnovljeno čitajući podatke iz ObjectInputStream-a za individualna polja i stvarajući dodjelu odgovarajućem polju objekta. Čitajući primitivnih tipova podataka je omogućeno sa DataInput-om.

Svaki pokušaj čitanja objekta koji premašuje granice uobičajenog podatka zapisanog sa odgovarajućom writeObject metodom uzrokovat će izbacivanje OptionalData iznimke sa eof poljem vrijednosti istine. Ne-objekti čitaju koji premašuje kraj dodijeljenog podatka odrazit će kraj podatka istim načinom kojim bi naznačili kraj toka: bytewise čitanje će vratiti -1 kao bajt čitanja ili broj bajtova za čitanje, a primitivno čitanje će izbaciti EOF iznimku. Ako nema odgovarajuće writeObject metode, tada kraj standardnog serijaliziranog podatka označava kraj dodijeljenog podatka.

Page 5: Seminarski Rad ObjectInputStream

Članovi klase OutputStream

Konstruktori ( Constructors )

ObjectInputStream

public ObjectInputStream (InputStream in )throws IOException

Kreira ObjectInput tok koji čita iz specificiranog Input toka. Zaglavlje serijaliziranog toka je pročitano iz toka i verificirano. Ovaj konstruktor će biti zaustavljen sve dok odgovarajući ObjectOutput tok nije zapisan i dok zaglavlje nije poplavljeno.

Ako je instaliran sigurnosni manager, konstruktor će provjeriti « enableSubclassImplementation » SerializablePermission kada je pozvan direktno ili

Page 6: Seminarski Rad ObjectInputStream

indirektno od strane konstruktora podklase koja prelazi preko ObjectInputStream.readFields ili ObjectInputStram.readUnshared metoda.

Parametri: in - ulazni tok iz kojeg se čita

Izuzeci: StreamCorruptedException – ako je zaglavlje toka netočnoIOException - ako se dogodi I/O greška prilikom čitanja zaglavlja tokaSecurityException – ako neprovjerena podklasa ilegalno prelazi sigurnosno osjetljive metodeNullPointerException – ako je in nula

ObjectInputStream

public ObjectInputStream ( )throws IOException,

SecurityException

Omogućuje put podklasama koje su kompletno reimplementirane ObjectInputStream da nemaju alocirani privatni podatak samo korišten od ove implementacije ObjectInputStream-a.

Ako je instaliran sigurnosni manager, metoda prvo poziva metodu checkPermission sigurnosnog managera sa SerializablePermission ( "enableSubclassImplementation" ) dopuštenjem da osigura korištenje podklasa.

Izuzeci: IOException SecurityException – ako postoji sigurnosni manager i ako checkPermission metoda negira omogućavaje podklasa

Metode ( Methods )

readObject

public final Object readObject() throws IOException, ClassNotFoundException

Page 7: Seminarski Rad ObjectInputStream

Čita objekt iz ObjectInput toka. Klasa objekta, potpis klase, i vrijednost ne-privremenog i ne-statičnog polja klase i svi njegovi super-tipovi su pročitani. Standardna deserijalizacija klase može biti prijeđena koristeću writeObject i readObject metode. Objekti referencirani od ovog objekt su čitani prijenosno pa je tako kompletno ekvivalentni grafikon objekta je rekonstruiran od readObject-a.

Glavni objekt je kompletno obnovljen kada su sva njegova polja i objekti koje referencira kompletno obnovljeni. Ovdje, povratna validacija objekta je izvršena u slijedu baziranom na njegovom registriranom prioritetu. Povratna veza je registrirana od strane objekta dok je on individualno obnovljen.

Iznimka je izbačena ako se dogodi problem sa Input tokom i klasama koje ne smiju biti deserijalizirane. Sve iznimke su kobne za Input tok i ostavlja ga u neodređenom stanju.

Određena od:

readObject in interface ObjectInput

Vraća: Objekt pročitan iz toka

Izuzeci: ClassNotFoundException – Klasa serijaliziranog objekta ne može biti pronađenaInvalidClassException - Something is wrong with a class used by serialization. StreamCorruptedException - Control information in the stream is inconsistent. OptionalDataException - Primitive data was found in the stream instead of objects. IOException - Any of the usual Input/Output related exceptions.

write

public void write(byte[] b) throws IOException

Ova metoda zapisuje b dužinu bajtova iz specificiranog ajt polja u ovaj izlazni tok.

Glavni dogovor za write(b) je da bi trebao imati točno jednaki efekt kao poziv write(b, o, b.length).

Parametri: b– podatak

Page 8: Seminarski Rad ObjectInputStream

Izuzeci:IOException – Ako se dogodi I/O greška

writer

public void write(byte[] b, int off, int len) throws IOException

Zapisuje dužinu bajtova iz specificiranog bajt polja startajući kod granaja off ovog izlaznog toka. Glavni dogovor za write (b, off, len) je da su neki bajtovi u polju b zapisani u izlazni tok u poretku; element b[off] je prvi bajt koji je zapisan a b[off+len-¸1] je zadnji bajt koji je zapisan ovom operacijom.

Ako je b jednak nuli, NullPointerException je poslana.

Ako je off negativan, ili je len negativan, ili ako je off+len veći od dužine polja b, tada je poslana iznimka IndexOutOfBoundsException.

Parametri: b- podatakoff- startni ogranak u podatkulen – broj bajtova za zapis

Izuzeci:IOException – Ako se dogodi I/O greška. Posebice IOException može biti izbačena ako je izlazni tok zatvoren.

flush

public void flush() throws IOException

Poplavljuje ovaj izlazni tok i tjera svaki baferiran izlazni bajt da bude zapisan. Glavni dogovor kod flush je da se pozove ako su indikacije za to, ako je bilo koji bajt prethodno zapisan buferiran od impementacije izlaznog toka, takvi bajtovi moraju odmah biti zapisani na njihovo zamišljeno mjesto.

Page 9: Seminarski Rad ObjectInputStream

Flush metoda OutputStream – a ne radi ništa.

Izuzeci:IOException – Ako se dogodi I/O greška

close

public void close() throws IOException

Zatvara ovaj izlazni tok i pušta sve sistemske resurse povezane sa ovim tokom. Glavni dogovor kod close je ta zatvori izlazni tok. Zatvoreni tok ne može činiti izlazne operacije i ne može biti ponovno otvoren.

Close metoda OutputStream – a ne radi ništa.

Izuzeci:IOException – Ako se dogodi I/O greška

Klasa OutputStreamWriter

Page 10: Seminarski Rad ObjectInputStream

java.io Class OutputStreamWriterjava.lang.Object java.io.Writer java.io.OutputStreamWriter

Direktna podklasa - FileWriter

public class OutputStreamWriter extends Writer

OutputStreamWriter je most između znakovnog toka i bajtovnog toka. Znakovi zapisani u njega su kodirani u bajtove koristeći specijalni charset. Taj skup znakova koji on koristi može biti specificiran imenim ili može biti dat eksplicitno, ili može biti prihvaćen znakovni skup platforme.

Svaka invookacija write() metode uzrokuje da konverter za kodiranje bude pozvan na zadanim znakovima. Rezultirani bajtovi su nakupljeni u buferu prije nego što su zapisani u donji izlazni tok. Veličina ovog bufera može biti specificirana ali i default veličina je dovoljno velika za većinu namjena. Znakovi prebačeni write() metodom nisu buferirani.

Za vrhunsku efikasnost, uzimajući u obzir omotavanje OutputStreamWriter – a između BufferedWriter – a kako bi se izbjegle učestale invokacije konvertera. Na primjer:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

Polja( Fields )

lock

lock

.

Konstruktori ( Constructors )

Page 11: Seminarski Rad ObjectInputStream

OutputStreamWriter

Public OutputStreamWriter(OutputStream out, String charsetName)Throws UnsupportedEncodingException

Kreira OutputStreamWriter koji koristi navedeni skup znakova.

Parametri:out – izlazni tokcharsetName – naziv skupa znakova

Izuzeci:UnsupportedEncodingException – Ako navedeno kodiranje nije podržano

OutputStreamWriter

public OutputStreamWriter(OutputStream out)

Kreira OutputStreamWriter koji koristi zadano znakovno kodiranje

Parametri:out – izlazni tok

OutputStreamWriter

public OutputStreamWriter(OutputStream out, Charset cs)

Kreira OutputStreamWriter koji koristi zadani skup znakova.

Parametri:out – izlazni tokcs – skup znakova

OutputStreamWriter

public OutputStreamWriter(OutputStream out, CharsetEncoder enc)

Kreira OutputStreamWriter koji koristi zadani skup znakova za kodiranje

Parametri:out – izlazni tokenc – skup znakova za kodiranje

Page 12: Seminarski Rad ObjectInputStream

Metode ( Methods )

getEncoding

public String getEncoding()

Vraća ime znaka za kodiranje koji je korišten od strane toka.

Ako kodiranje ima povijesno ime, ime je vraćeno, inače je kodirano kanoničko ime vraćeno.

Ako je kreirana instanca sa OutputStreamWriter(OutputStream, String) , konstruktor tada vraćeno ime, koje je jedinstveno za kodiranje može razlikovati od imena poslanom konstruktoru. Ova metoda može vratiti vrijednost nule ako je tok zatvoren.

write

public void write(int c) throws IOException

Zapisuje jedan znak.

Parametri:c – int specificira znak koji će biti zapisan

Izuzeci:IOException – Ako se dogodi I/O greška

write

public void write(char[] cbuf, int off, int len) throws IOException

Zapisuje dio iz polja znakova.

Parametri:

Page 13: Seminarski Rad ObjectInputStream

cbuf – Polje znakovaoff - ogranak od kuda počinje pisanje znakovalen – broj znakova za zapisivanje

Izuzeci:IOException – Ako se dogodi I/O greška

write

public void write(String str, int off, int len) throws IOException

Zapisuje dio stringova.

Parametri: str – stringoff - ogranak od kuda počinje pisanje znakovalen – broj znakova za zapisivanje

Izuzeci:IOException – Ako se dogodi I/O greška

flush

public void flush() throws IOException

Poplavljuje tok.

Izuzeci:IOException – Ako se dogodi I/O greška

close

public void close() throws IOException

Zatvara tok.

Izuzeci:IOException – Ako se dogodi I/O greška

Page 14: Seminarski Rad ObjectInputStream

Primjeri korištenja klase BufferedWriter

* * Java Network Programming, Second Edition * Merlin Hughes, Michael Shoffner, Derek Hamner * Manning Publications Company; ISBN 188477749X * * http://nitric.com/jnp/ * * Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner; * all rights reserved; see license.txt for details. */

import java.io.*;

public class SimpleOut { public static void main (String[] args) throws IOException { for (int i = 0; i < args.length; ++ i) { println (args[i]); } }

public static void println (String msg) throws IOException { synchronized (System.out) { for (int i = 0; i < msg.length (); ++ i) System.out.write (msg.charAt (i) & 0xff); System.out.write ('\n'); } System.out.flush (); }}

/* all of the write() methods of class OutputStream are declared as throwing IOException */