JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/7.Eloadas.pdf · Memória és egy...

Preview:

Citation preview

JAVA PROGRAMOZÁS7.ELŐADÁS

Dr. Pál László, Sapientia EMTE, Csíkszereda

7.ELŐADÁS

Állománykezelés2014-2015 tavasz

Állományok, bejegyzések2

A java.io csomag3

Útvonalak4

� Absztrakt / valódi útvonal� A valódi útvonal részei

� Prefix: "www.gdf.hu/", "/"(Unix), "c:\", "\\"(Windows)� Nulla vagy több név szeparátorokkal elválasztva� Nulla vagy több név szeparátorokkal elválasztva� Szeparátor: "/"(Unix), "\"(Windows)� Útvonalszeparátor: ":"(Unix), ";"(Windows)

� Helyi / távoli� Abszolút / relatív� Szülő / gyermek

Útvonalak5

� Példa:

Aktuális könyvtár Relatív útvonal

Abszolút útvonal

NévNév

Gyermek útvonalSzülő útvonal

c:\javaprog\work\icons\insert.gif

File osztály6

� Bejegyzést reprezentál

� A bejegyzést útvonalával azonosítja� Mezők

� static String separatorstatic char separatorCharstatic char separatorChar

� static String pathSeparatorstatic char pathSeparatorChar

� Konstruktorok� File(String pathname)� File(String parent, String child)

File(File parent, String child)

File osztály7

� Metódusok - A bejegyzés útvonala

� boolean isAbsolute()

� String getAbsolutePath()File getAbsoluteFile()

� String getPath()

� String getCanonicalPath() throws IOExceptionFile getCanonicalFile() throws IOException

� String getParent()File getParentFile()

� String getName()

File osztály8

� Metódusok - A bejegyzés tulajdonságai

� boolean isDirectory()boolean isFile()

� long length()

� long lastModified()boolean setLastModified(long time)

� boolean canRead()boolean canWrite()boolean exists()boolean isHidden()

� boolean setReadOnly()

File osztály9

� Metódusok – Karbantartás

� boolean mkdir()boolean mkdirs()

� boolean createNewFile() throws IOException

� boolean delete()

� void deleteOnExit()

� boolean renameTo(File dest)

File osztály10

� Metódusok - Bejegyzéslisták

� String[] list()String[] list(FilenameFilter filter)

� File[] listFiles()File[] listFiles(FilenameFilter filter)File[] listFiles(FilenameFilter filter)

� static File[] listRoots()

� Metódusok - Egyéb

� equals(Object o)compareTo(File pathName)compareTo(Object o)

� String toString()

Példa - Jellemzők11

Állományműveletek - Példa12

� Adva vannak a következő könyvtárak és állományok:c:/javaprog/work/proba/App.javac:/javaprog/work/proba/FileAttributes.clasc:/javaprog/work/proba/FileAttributes.javac:/javaprog/work/proba/icons/delete.gifc:/javaprog/work/proba/icons/insert.gifc:/javaprog/work/proba/icons/insert.gif� A c:/javaprog/work/proba könyvtárban végezzük el akövetkező állományműveleteket:− Nevezzük át az App.java állományt App.~jav-ra!− Töröljük ki a teljes icons könyvtárat! Feltételezzük, hogy

abban nincs további könyvtár.− Hozzunk létre egy üres readme.txt szöveges állományt!

� Minden egyes művelet után listázzuk ki a könyvtár tartalmát!

Állományműveletek - Példa13

Állományműveletek - Példa14

Állományműveletek - Példa15

Szűrés – FilenameFilter interfész16

� Könyvtárbejegyzések szűrését szolgálja

� Metódus

� boolean accept(File dir, String name)

� Feladat:� Feladat:� Írjuk ki konzolra a program paramétereként megadott

könyvtár összes exe állományát! Ha nem adnak meg paramétert, akkor az aktuális könyvtárból listázzunk

Szűrés – FilenameFilter interfész17

� Feladat (folytatás):

Szűrés – FilenameFilter interfész18

� Feladat (folytatás):

Állománykiválasztó dialógus –JFileChooser

19

KönyvtárKönyvtárlista

SzűrőFájlnév

Állománykiválasztó dialógus –JFileChooser (folyt.)

20

� Modális dialógus ablak, melynek feladata egy abszolút útvonal bekérése

� A dialógus elemei� Aktuális könyvtár

� Könyvtárlista� Könyvtárlista

� Szűrő

� Fájlnév

� Dialógus típusai: megnyitás, mentés� Mezők

� static int OPEN_DIALOG, SAVE_DIALOG

� static int APPROVE_OPTION, CANCEL_OPTION, ERROR_OPTION

Állománykiválasztó dialógus –JFileChooser (folyt.)

21

� Jellemzők

� String dialogTitle

� int dialogType (OPEN_DIALOG, SAVE_DIALOG)

� int fileSelectionMode� int fileSelectionMode(FILES_ONLY (alapért.), DIRECTORIES_ONLY,FILES_AND_DIRECTORIES)

� boolean multiSelectionEnabled

� FileFilter fileFilter

� File currentDirectory

� File selectedFile

File[] selectedFiles

Állománykiválasztó dialógus –JFileChooser (folyt.)

22

� Konstruktorok

� JFileChooser()

� JFileChooser(File currentDirectory)JFileChooser(String currentDirectoryPath)

� Metódusok

� int showOpenDialog(Component parent)int showSaveDialog(Component parent)Lehetséges visszatérési értékek: APPROVE_OPTION, CANCEL_OPTION, ERROR_OPTION

� String getName(File f)

Állománykiválasztó dialógus –JFileChooser (folyt.)

23

� Példa:

Állománykiválasztó dialógus –JFileChooser (folyt.)

24

� Példa:

Folyamok25

Osztályok26

A folyam fogalma27

� Folyam (stream): objektum, amely egy célhelyre adatokat képes sorosan írni, ill. egy forráshelyről sorosan olvasni

� Folyamok osztályzása (feldolgozott elemek típusa szerint)szerint)� Bájtfolyam (byte stream)

� Karakterfolyam (character stream)

� Adatfolyam (data stream)

� Objektumfolyam (object stream)

� Folyamok osztályzása (adatfeldolgozás iránya szerint)� Beviteli folyam (input stream)

� Kiviteli folyam (output stream)

Egyéb fogalmak28

� Folyam mutatója� Forráshely, célhely

� Fizikai hely (pl. fájl, konzol, billentyűzet, nyomtató)vagy másik folyam

� Megadása: létrehozáskor (konstr. paramétereként)

� Szűrőfolyam (filter stream)� Folyamok összekapcsolásánál használjuk� Továbbító, szűrő szerepet játszik� Szűrők ősosztályai: FilterInputStream, FilterOutputStream

� Szűrőfajták� Pufferelés: Buffered...� Konverzió: Data...

Példa29

Példa30

DataOutputStream dos = new DataOutputStream(new FileOutputStream("adatok.dat"));

dos.writeDouble(12.4);dos.writeBoolean(true);dos.writeChar('é');dos.close();dos.close();

DataInputStream dis = new DataInputStream(new FileInputStream("adatok.dat"));

double d = dis.readDouble(); // � 12.4boolean b = dis.readBoolean(); // � truechar c = dis.readChar(); // � 'é'dis.close();

Bájtfolyam (byte stream)31

� Írás/olvasás egysége: bájt (0..255)

� Minden adatsorozat feldolgozható bájtfolyamként

� Absztrakt ősei: InputStream, OutputStream

� Állományból olvasó bájtfolyam: � Állományból olvasó bájtfolyam: FileInputStream

� Állományba író bájtfolyam: FileOutputStream

Bájtfolyam osztályok32

InputStream33

� Összes beviteli bájtfolyam absztrakt őse

� Metódusok

� abstract int read() throws IOException

� int read(byte[] b) throws IOException� int read(byte[] b) throws IOExceptionint read(byte[] b, int off, int len) throws IOException

� int available() throws IOException

� long skip(long n) throws IOException

� void close() throws IOException

OutputStream34

� Összes kiviteli bájtfolyam absztrakt őse

� Metódusok

� abstract void write(int b) throws IOException

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

� void flush() throws IOException

� void close() throws IOException

FileInputStream - állományból olvasó bájtfolyam

35

FileInputStream

+FileInputStream(name: String) {FileNotFoundException}+FileInputStream(file: File) {FileNotFoundException}+read():int {IOException}+read():int {IOException}+read(b: byte[]): int {IOException}+read(b: byte[], off: int, len: int): int {IOException}+available(): int {IOException}+skip(n: long): long {IOException}+close() {IOException}...

FileOutputStream - állományba író bájtfolyam

36

FileOutputStream

+FileOutputStream(name: String) {FileNotFoundException}+FileOutputStream(file: File) {FileNotFoundException}+FileOutputStream(name: String, append: boolean) +FileOutputStream(name: String, append: boolean)

{FileNotFoundException}+write(b: int):int {IOException}+write(b: byte[]):int {IOException}+write(b: byte[], off: int, len: int):int {IOException}+flush() {IOException}+close() {IOException}...

Példa – Állomány másolása37

� 1. megoldás – bevitel és kivitel bájtonként

Példa – Állomány másolása38

� 2. megoldás – bevitel és kivitel egy adagban

3. megoldás – biztonságos lezárás� 3. megoldás – biztonságos lezárás

Karakterfolyam (character stream) 39

� Írás/olvasás egysége: unikód karakter (2 bájt)

� Szöveges állományok feldolgozására szokás használni

� Absztrakt ősei: Reader, Writer� Absztrakt ősei: Reader, Writer

� Pl.: FileReader, FileWriter

Reader40

� Összes beviteli karakterfolyam absztrakt őse

� Metódusok

� int read() throws IOException

� int read(char[] cbuf) throws IOException� int read(char[] cbuf) throws IOExceptionabstract int read(char[] cbuf,int off, int len)

throws IOException

� boolean ready() throws IOException

� long skip(long n) throws IOException

� abstract void close() throws IOException

Writer41

� Összes kiviteli karakterfolyam absztrakt őse

� Metódusok

� void write(int c) throws IOException

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

throws IOException

� void write(String str) throws IOExceptionvoid write(String str, int off, int len)

throws IOException

� abstract void flush() throws IOException

� abstract void close() throws IOException

Szöveges állomány42

� Csak olvasható karaktereket tartalmazó állomány

� Sorokból áll, a sorok pedig karakterekből

� Soros szervezésű

� Logikai szerkezet� Logikai szerkezet

Szöveges állomány43

� Állományból olvasó karakterfolyam: FileReader

� Állományba író karakterfolyam: FileWriter

� Karakterkódolás

� A szöveges állomány tárolásának módja az operációs � A szöveges állomány tárolásának módja az operációs rendszer karakterkódolási szabványától függ

� Lemezen tárolt karakter és a Java karakterei között kódolás/dekódolás: InputStreamReader, OutputStreamWriter

FileReader - állományból olvasó karakterfolyam

44

FileReader

+FileReader(fileName: String) {FileNotFoundException}+FileReader(file: File) {FileNotFoundException}+read():int {IOException}+read():int {IOException}+read(cbuf: char[]):int {IOException}+read(cbuf: char[], off: int, len: int):int {IOException}+ready():boolean {IOException}+skip(n: long):long {IOException}+close() {IOException}...

FileWriter - állományba író karakterfolyam

45

FileWriter

+FileWriter(fileName: String) {FileNotFoundException}+FileWriter(file: File) {FileNotFoundException}+FileWriter(fileName: String, append:boolean)

{FileNotFoundException}{FileNotFoundException}+write(c: int) {IOException}+write(cbuf: char[]) {IOException}+write(cbuf: char[], off: int, len: int) {IOException}+write(str: String) {IOException}+write(str: String, off: int, len: int) {IOException}+flush() {IOException}+close() {IOException}...

Példa – Állomány bővítés46

PrintWriter47

� print és println metódusokat definiál � az adatok olvasható formában kerülnek ki a karakterfolyamra

� PrintStream� PrintWriter-hez hasonló, de elavult

� System.out és System.err szabványos eszközök osztálya� System.out és System.err szabványos eszközök osztálya

� Példa (szöveges állomány írása formázva):PrintWriter writer = new PrintWriter(newFileWriter("print.txt"));writer.println("Double: "+12.78);writer.print('A');writer.println(new Integer(66));writer.close();

Adatfolyam (data stream)48

� Írás/olvasás egysége: primitív adat vagy String

� Szűrő bájtfolyam: primitív adat / String � bájt konverzió

� Pl.: DataInputStream, DataOutputStream� Pl.: DataInputStream, DataOutputStream

� DataInput, DataOutput interfészek

� primitív adat és String írása / olvasása

� primitív adat / String � bájt konverzió

� FilterInputStream, FilterOutputStream

� Szűrőfolyamok ősosztályai

Bájtfolyamok49

Interfészek50

� DataInput interfész (bájt � primitív adat / String)� boolean readBoolean() throws IOException� byte readByte() throws IOException� …� String readLine() throws IOException

String readUTF() throws IOException� String readUTF() throws IOException

� DataOutput interfész (primitív adat / String � bájt) � void write(int b) throws IOException

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

� void writeBoolean(boolean v) throws IOExceptionvoid writeByte(int v) throws IOException

� …� void writeBytes(String s) throws IOException

void writeChars(String s) throws IOException

DataInputStream/DataOutputStream51

� DataInputStream

� Beviteli szűrő adatfolyam

� Csak egy másik bájtfolyamból tud olvasni

� bájt � primitív adat / String konverzió

� Konstruktor:� Konstruktor:DataInputStream(InputStream in)

� DataOutputStream

� Kiviteli szűrő adatfolyam

� Csak egy másik bájtfolyamba tud írni

� primitív adat / String � bájt konverzió

� Konstruktor:DataOutputStream(OutputStream out)

Példa – Egész számok írása, olvasása52

Pufferező folyam53

� Memória és egy külső erőforrás (pl. fájl) között az író/olvasó műveletek számát csökkenti

� BufferedInputStream, BufferedOutputStream

� Bájtfolyamot pufferező beviteli/kiviteli szűrőfolyam� Bájtfolyamot pufferező beviteli/kiviteli szűrőfolyam

� Konstruktorok� BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in, int size)

� BufferedOutputStream(OutputStream out)BufferedOutputStream(OutputStream out, int size)

Pufferező folyam54

BufferedReader, BufferedWriter

� Karakterfolyamot pufferező beviteli/kiviteli folyam

� Konstruktorok� BufferedReader(Reader in)

BufferedReader(Reader in, int size)BufferedReader(Reader in, int size)

� BufferedWriter(Writer out)BufferedWriter(Writer out, int size)

Pufferező folyam55

Példa – Adatok kiírása56

FileOutputStream os1 = new FileOutputStream("adatok.dat");BufferedOutputStream os2 = new BufferedOutputStream(os1);DataOutputStream os3 = new DataOutputStream(os2);

/* Szebben:DataOutputStream os3 = new DataOutputStream(newDataOutputStream os3 = new DataOutputStream(newBufferedOutputStream(new

FileOutputStream("adatok.dat")));*/os3.writeInt(12);os3.writeChar('a');os3.writeFloat(5.2F);os3.writeBoolean(true);os3.close();

Példa – Adatok visszaolvasása57

FileInputStream is1 = new FileInputStream(fájl);BufferedInputStream is2 = new BufferedInputStream(is1);DataInputStream is3 = new DataInputStream(is2);/* Szebben:

DataInputStream is3 = new DataInputStream(newBufferedInputStream(newBufferedInputStream(new

FileInputStream("adatok.dat")));*/int i = is3.readInt();char c = is3.readChar();float f = is3.readFloat();boolean b = is3.readBoolean();is3.close();

Példa58

Objektumfolyam (object stream)59

� Írás/olvasás egysége:� primitív adat vagy

� szerializálható objektum

� SzerializációObjektum � bájtfolyam� Objektum � bájtfolyam

� Előnye: objektumok perzisztensen eltárolhatók

� Írás� objektum � bájtfolyam

� ObjectOutputStream

� Olvasás� bájtfolyam � objektum

� ObjectInputStream

Bájtfolyamok60

ObjectOutputStream61

ObjectInputStream62

Egy objektum szerializálásának szabályai

63

� Az objektum osztályának implementálnia kell a Serializable jelölő interfészt

� Szerializálás� deklarálás sorrendjében� deklarálás sorrendjében

� minden objektum csak egyszer kerül tárolásra

� java.io.NotSerializableException keletkezhet

� Szerializáláskor a bájtfolyamra kerülő adatok:� osztály azonosításához: osztály neve, azonosítója, …

� objektum adatai(kivéve static és transient adatok)

Egy objektum szerializálásának szabályai

64

� Visszatöltéskor az objektum állapota ugyanaz lesz, mint kimentéskor volt

� Visszaolvasás� ugyanolyan sorrendben, mint kiíráskor� ugyanolyan sorrendben, mint kiíráskor

� java.lang.ClassNotFoundException keletkezhet

� Alapértelmezett szerializáló mechanizmus� Felírja az objektum osztályának nevét, azonosítóját

� Felírja az objektum összes saját és ős adatmezőjét, kivéve a tranziens és statikus mezőket

Példa – Objektum elmentése és visszaolvasása

65

� Írjunk ki egy "work/objektumok.dat" állományba két String-objektumot, egy primitív egész számot, és egy saját, MyClass osztályú objektumot. Olvassuk vissza az állomány tartalmát!

Példa – Objektum elmentése és visszaolvasása

66

Példa – Objektum elmentése és visszaolvasása

67

Transient68

� Ha azt szeretnénk, hogy egy példányadat ne kerüljön stream-re, akkor az adatot transientmódosítóval kell ellátnunk

� A transient jelentése: múlandó, átmeneti� A transient jelentése: múlandó, átmeneti

� Egy ilyen mező minden esetben a program futása során kap értéket

� Visszaolvasáskor a rendszer tudja, hogy ennek a mezőnek helyet kell foglalni, de értéket nem ad neki

Könyvészet69

� Angster Erzsébet, Objektumorientált tervezés és programozás. Java I-II. (Bazele programării orientate pe obiecte), Ed. 4 Kör Bt., Budapesta, 2002.

� Kathy Sierra, Bert Bates: Agyhullám: Java, Kiskapú, 2011.2011.

Recommended