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.