Dr. Pál László, Sapientia EMTE, Csíkszereda JAVA PROGRAMOZÁS 7.ELŐADÁS 2014-2015 tavasz Állománykezelés
2 Állományok, bejegyzések
3 A java.io csomag
Útvonalak 4 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 Szeparátor: "/"(Unix), "\"(Windows) Útvonalszeparátor: ":"(Unix), ";"(Windows) Helyi / távoli Abszolút / relatív Szülő / gyermek
Útvonalak 5 Példa: Abszolút útvonal Aktuális könyvtár Relatív útvonal Név c:\javaprog\work\icons\insert.gif Szülő útvonal Gyermek útvonal
File osztály 6 Bejegyzést reprezentál A bejegyzést útvonalával azonosítja Mezők static String separator static char separatorchar static String pathseparator static char pathseparatorchar Konstruktorok File(String pathname) File(String parent, String child) File(File parent, String child)
File osztály 7 Metódusok - A bejegyzés útvonala boolean isabsolute() String getabsolutepath() File getabsolutefile() String getpath() String getcanonicalpath() throws IOException File getcanonicalfile() throws IOException String getparent() File getparentfile() String getname()
File osztály 8 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ály 9 Metódusok Karbantartás boolean mkdir() boolean mkdirs() boolean createnewfile() throws IOException boolean delete() void deleteonexit() boolean renameto(file dest)
File osztály 10 Metódusok - Bejegyzéslisták String[] list() String[] list(filenamefilter filter) File[] listfiles() File[] listfiles(filenamefilter filter) static File[] listroots() Metódusok - Egyéb equals(object o) compareto(file pathname) compareto(object o) String tostring()
11 Példa - Jellemzők
Állományműveletek - Példa 12 Adva vannak a következő könyvtárak és állományok: c:/javaprog/work/proba/app.java c:/javaprog/work/proba/fileattributes.clas c:/javaprog/work/proba/fileattributes.java c:/javaprog/work/proba/icons/delete.gif c:/javaprog/work/proba/icons/insert.gif A c:/javaprog/work/proba könyvtárban végezzük el a következő állományműveleteket: Nevezzük át azapp.java állománytapp.~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 üresreadme.txt szöveges állományt! Minden egyes művelet után listázzuk ki a könyvtár tartalmát!
13 Állományműveletek - Példa
14 Állományműveletek - Példa
15 Állományműveletek - Példa
Szűrés FilenameFilter interfész 16 Könyvtárbejegyzések szűrését szolgálja Metódus boolean accept(file dir, String name) 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ész 17 Feladat (folytatás):
Szűrés FilenameFilter interfész 18 Feladat (folytatás):
Állománykiválasztó dialógus 19 JFileChooser Könyvtárlista Könyvtár Fájlnév Szűrő
Állománykiválasztó dialógus 20 JFileChooser (folyt.) 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 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 21 JFileChooser (folyt.) Jellemzők String dialogtitle int dialogtype (OPEN_DIALOG, SAVE_DIALOG) 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 22 JFileChooser (folyt.) 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 23 JFileChooser (folyt.) Példa:
Állománykiválasztó dialógus 24 JFileChooser (folyt.) Példa:
25 Folyamok
26 Osztályok
A folyam fogalma 27 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) 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 fogalmak 28 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...
29 Példa
Példa 30 DataOutputStream dos = new DataOutputStream( new FileOutputStream("adatok.dat")); dos.writedouble(12.4); dos.writeboolean(true); dos.writechar('é'); dos.close(); DataInputStream dis = new DataInputStream( new FileInputStream("adatok.dat")); double d = dis.readdouble(); // 12.4 boolean b = dis.readboolean(); // true char 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: FileInputStream Állományba író bájtfolyam: FileOutputStream
32 Bájtfolyam osztályok
InputStream 33 Összes beviteli bájtfolyam absztrakt őse Metódusok abstract int read() throws IOException int read(byte[] b) throws IOException int read(byte[] b, int off, int len) throws IOException int available() throws IOException long skip(long n) throws IOException void close() throws IOException
OutputStream 34 Ö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, int off, int len) throws IOException void flush() throws IOException void close() throws IOException
35 FileInputStream - állományból olvasó bájtfolyam FileInputStream +FileInputStream(name: String) {FileNotFoundException} +FileInputStream(file: File) {FileNotFoundException} +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}...
36 FileOutputStream - állományba író bájtfolyam FileOutputStream +FileOutputStream(name: String) {FileNotFoundException} +FileOutputStream(file: File) {FileNotFoundException} +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ása 37 1. megoldás bevitel és kivitel bájtonként
Példa Állomány másolása 38 2. megoldás bevitel és kivitel egy adagban 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 Pl.: FileReader, FileWriter
Reader 40 Összes beviteli karakterfolyam absztrakt őse Metódusok int read() throws IOException int read(char[] cbuf) throws IOException abstract 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
Writer 41 Összes kiviteli karakterfolyam absztrakt őse Metódusok void write(int c) throws IOException void write(char[] cbuf) throws IOException abstract void write(char[] cbuf, int off, int len) throws IOException void write(string str) throws IOException void write(string str, int off, int len) throws IOException abstract void flush() throws IOException abstract void close() throws IOException
Szöveges állomány 42 Csak olvasható karaktereket tartalmazó állomány Sorokból áll, a sorok pedig karakterekből Soros szervezésű Logikai szerkezet
Szöveges állomány 43 Á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 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
44 FileReader - állományból olvasó karakterfolyam FileReader +FileReader(fileName: String) {FileNotFoundException} +FileReader(file: File) {FileNotFoundException} +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}...
45 FileWriter - állományba író karakterfolyam FileWriter +FileWriter(fileName: String) {FileNotFoundException} +FileWriter(file: File) {FileNotFoundException} +FileWriter(fileName: String, append:boolean) {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}...
46 Példa Állomány bővítés
PrintWriter 47 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(new FileWriter("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 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
49 Bájtfolyamok
Interfészek 50 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 DataOutput interfész (primitív adat / String bájt) void write(int b) throws IOException void write(byte[] b) throws IOException void write(byte[] b, int off, int len) throws IOException void writeboolean(boolean v) throws IOException void writebyte(int v) throws IOException void writebytes(string s) throws IOException void writechars(string s) throws IOException
DataInputStream/DataOutputStream 51 DataInputStream Beviteli szűrő adatfolyam Csak egy másik bájtfolyamból tud olvasni bájt primitív adat / String konverzió 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)
52 Példa Egész számok írása, olvasása
Pufferező folyam 53 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 Konstruktorok BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size) BufferedOutputStream(OutputStream out) BufferedOutputStream(OutputStream out, int size)
Pufferező folyam 54 BufferedReader, BufferedWriter Karakterfolyamot pufferező beviteli/kiviteli folyam Konstruktorok BufferedReader(Reader in) BufferedReader(Reader in, int size) BufferedWriter(Writer out) BufferedWriter(Writer out, int size)
55 Pufferező folyam
Példa Adatok kiírása 56 FileOutputStream os1 = new FileOutputStream("adatok.dat"); BufferedOutputStream os2 = new BufferedOutputStream(os1); DataOutputStream os3 = new DataOutputStream(os2); /* Szebben: DataOutputStream os3 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("adatok.dat"))); */ os3.writeint(12); os3.writechar('a'); os3.writefloat(5.2f); os3.writeboolean(true); os3.close();
Példa Adatok visszaolvasása 57 FileInputStream is1 = new FileInputStream(fájl); BufferedInputStream is2 = new BufferedInputStream(is1); DataInputStream is3 = new DataInputStream(is2); /* Szebben: DataInputStream is3 = new DataInputStream(new BufferedInputStream(new FileInputStream("adatok.dat"))); */ int i = is3.readint(); char c = is3.readchar(); float f = is3.readfloat(); boolean b = is3.readboolean(); is3.close();
58 Példa
Objektumfolyam (object stream) 59 Írás/olvasás egysége: primitív adat vagy szerializálható objektum Szerializáció Objektum bájtfolyam Előnye: objektumok perzisztensen eltárolhatók Írás objektum bájtfolyam ObjectOutputStream Olvasás bájtfolyam objektum ObjectInputStream
60 Bájtfolyamok
61 ObjectOutputStream
62 ObjectInputStream
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 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 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
65 Példa Objektum elmentése és visszaolvasása Í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!
66 Példa Objektum elmentése és visszaolvasása
67 Példa Objektum elmentése és visszaolvasása
Transient 68 Ha azt szeretnénk, hogy egy példányadat ne kerüljön stream-re, akkor az adatot transient módosítóval kell ellátnunk 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észet 69 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.