13. Állományok, bejegyzések 14. Folyamok 15. Közvetlen hozzáférésű állomány. Programozási technológia (Java) - III. / 1

Hasonló dokumentumok
JAVA PROGRAMOZÁS 7.ELŐADÁS

Java programozási nyelv 10. rész Input/output kezelés

JAVA ALKALMAZÁSOK 5. ELŐADÁS 1/9/2017 1

JAVA PROGRAMOZÁS 8.ELŐADÁS

Java programozási nyelv

Programozási nyelvek Java

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

TCP/IP kapcsolat Java nyelven

Reader /Writer InputStreamReader, OutputStreamWriter

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Java Programozás 9. Ea: Java fájlkezelés. Sztrímtan

Programozási technológia

Be- és kimenet kezelése

Osztályszintű elérés, kivételkezelés, fájlkezelés

Java Programozás 3. Gy: Java GUI. Swing, AWT

Programozási technológia

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozási nyelvek II.: JAVA

Az új be- és kimenet könyvtár

Segédanyag: Java alkalmazások gyakorlat

Java gyakorlat feladatai e s megolda sai ( )

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Segédanyag: Java alkalmazások gyakorlat

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Java Programozás 11. Ea: MVC modell

Kivételkezelés, naplózás. Exception handling, logging

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

A Java nyelv. Dialógus ablakok. Elek Tibor

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Programozási nyelvek Java

Debreceni Egyetem Informatika Kar. Mobiltelefon programozás és mobil adatbázis-kezelés

Java Programozás 7. Gy: Java alapok. Adatkezelő 3.rész

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Dr. Iszály György Barna

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

7. K: JAVA alapok Konzultáció

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Példaprogramok Android alá (Lista, mentés, visszatöltés, pattogó android figura) Android alapok. Android játékfejlesztés.

Java programozási nyelv 4. rész Osztályok II.

Input Output Műveletek

Bánsághi Anna 2014 Bánsághi Anna 1 of 35

Informatika terméktervezőknek

Programozási nyelvek Java

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

OOP: Java 8.Gy: Abstract osztályok, interfészek

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Szoftvertechnológia alapjai Java előadások

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Pénzügyi algoritmusok

Programozási nyelvek JAVA EA+GY 1. gyakolat

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

és az instanceof operátor

ZH mintapélda. Feladat. Felület

Az emelt szintű. informatika érettségi. programozási feladatainak. megoldása Java nyelven. NetBeans IDE 8.1 környezetben

Szoftvertechnológia alapjai Java előadások

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

ANDROID ALKALMAZÁSFEJLESZTÉS

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Segédanyag: Java alkalmazások gyakorlat

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

OOP: Java 8.Gy: Gyakorlás

Ja J v a a v a há h l á óz ó a z t a i al a ka k l a maz ma á z s á o s k o Socket, URL

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Java tutorial. Be- es kimenet kezelese. A legelsoprogram. Hogyan hasznaljunk fajlokat? Bemenet es kimenet absztrakciüja

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

XML adatkezelés I. Az SAX szabvány. Dr. Kovács László Miskolci Egyetem Általános Informatikai Tanszék. XML adatok kezelési lehetőségei

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Java programozási nyelv 5. rész Osztályok III.

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

OOP: Java 1.Gy: Java alapok

Java programozási nyelv 6. rész Java a gyakorlatban

Kalapácsvetés 2016 szöveges

Példaprogram - 2. Objektum-orientált programozás Java és C++ nyelven. Példaprogram. Azonosítók. Dr. Rohonczy János. Azonosítók

Programozási nyelvek és módszerek Java Thread-ek

Programozás I. Első ZH segédlet

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Programozási nyelv Java

BME MOGI Gépészeti informatika 13.

Java Programozás 8. Gy: Java alapok. Adatkezelő 4.rész

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Programozási nyelvek Java

A Java nyelv IV. rész - appletek, hálózati alkalmazások fejlesztése

Objektumorientált programozás C# nyelven III.

Java IX. telkezelés a Java-ban

Programozás I. Szöveges fájlok kezelése Felsorolástípus Objektumtömb Gyakorló feladatok

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

Átírás:

13. Állományok, bejegyzések 14. Folyamok 15. Közvetlen hozzáférésű állomány Programozási technológia (Java) - III. / 1

13. Állományok, bejegyzések 1. A java.io csomag 2. Útvonalak 3. A File osztály 4. Állományműveletek 5. Szűrés FilenameFilter interfész 6. Állománykiválasztó dialógus JFileChooser 7. Könyvtár felderítése rekurzióval Programozási technológia (Java) - III. / 2

java.lang.object +--File +--FilenameFilter +--InputStream +--ByteArrayInputStream +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 3 java.lang.object +--Reader +--InputStreamReader +--FileReader +--BufferedReader +--Writer +--OutputStreamWriter +--FileWriter +--PrintWriter +--BufferedWriter DataInput DataOutput +--RandomAccessFile java.io csomag

Útvonalak 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 útvonal Abszolút / relatív Aktuális könyvtár Szülő / gyermek Relatív útvonal Név c:\javaprog\work\icons\insert.gif Programozási technológia (Java) - III. / 4 Szülő útvonal Gyermek útvonal

Bejegyzést reprezentál Programozási technológia (Java) - III. / 5 File osztály 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)

Programozási technológia (Java) - III. / 6 File osztály (folyt.) 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()

Programozási technológia (Java) - III. / 7 File osztály (folyt.) 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 (folyt.) Metódusok - Karbantartás boolean mkdir() boolean mkdirs() boolean createnewfile() throws IOException boolean delete() void deleteonexit() boolean renameto(file dest) Programozási technológia (Java) - III. / 8

Metódusok - Egyéb Programozási technológia (Java) - III. / 9 File osztály (folyt.) Metódusok - Bejegyzéslisták String[] list() String[] list(filenamefilter filter) File[] listfiles() File[] listfiles(filenamefilter filter) static File[] listroots() equals(object o) compareto(file pathname) compareto(object o) String tostring()

Programozási technológia (Java) - III. / 10 Állományműveletek Feladat Átnevezés, törlés, létrehozás (RenDel) Adva vannak a következő könyvtárak és állományok: c:/javaprog/work/proba/app.java c:/javaprog/work/proba/fileattributes.class 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 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!

import java.io.*; public class RenDel { static void printdir(string dir) { File f = new File(dir); if (!f.exists() f.isfile()) { System.out.println(dir+" nem egy konyvtár."); return; System.out.println(dir+" bejegyzései:"); String[] list = f.list(); for (int i=0; i<list.length; i++) System.out.println(list[i]); System.out.println(); Programozási technológia (Java) - III. / 11

public static void main (String args[]) { String dir = "c:/javaprog/work/proba"; printdir(dir); File f = new File(dir,"App.java"); if (f.renameto(new File(dir,"App.~jav"))) System.out.println("Az átnevezés sikerült."); else System.out.println("Az átnevezés nem sikerült."); printdir(dir); f = new File(dir,"icons"); File[] list = f.listfiles(); Programozási technológia (Java) - III. / 12

if (list!=null) { for (int i=0; i<list.length; i++) list[i].delete(); if (f.delete()) System.out.println("A törlés sikerült."); else System.out.println("A törlés nem sikerült."); printdir(dir); else // list==null System.out.println("Nincs ilyen könyvtár."); Programozási technológia (Java) - III. / 13

f = new File(dir,"readme.txt"); try { f.createnewfile(); System.out.println("A létrehozás sikerült."); catch(ioexception e) { System.out.println("A létrehozás nem sikerült."); printdir(dir); // main // RenDel Programozási technológia (Java) - III. / 14

Szűrés FilenameFilter interfész Könyvtárbejegyzések szűrését szolgálja Metódus boolean accept(file dir, String name) Feladat Szűrés Í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! Futtatáskor a program paramétere legyen a java home könyvtár bin alkönyvtára! Programozási technológia (Java) - III. / 15

import java.io.*; class FiletypeFilter implements FilenameFilter { private String extension; public FiletypeFilter(String extension) { this.extension = extension.touppercase(); public boolean accept(file dir, String name) { return name.touppercase().endswith('.'+extension); Programozási technológia (Java) - III. / 16

public class Szures { public static void main(string[] args) { File f; if (args.length>0) f = new File(args[0]); else f = new File("."); if (!f.isdirectory()) { System.out.println("Nincs, vagy nem könyvtár."); return; Programozási technológia (Java) - III. / 17

String[] list = f.list(new FiletypeFilter("exe")); System.out.println(f.getAbsolutePath() + " könyvtár exe állományai:"); for(int i=0; i<list.length; i++) System.out.println(list[i]); // Szures Programozási technológia (Java) - III. / 18

Állománykiválasztó dialógus JFileChooser Könyvtárlista Könyvtár Fájlnév Szűrő Programozási technológia (Java) - III. / 19

Állománykiválasztó dialógus 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 Programozási technológia (Java) - III. / 20

Állománykiválasztó dialógus 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 Programozási technológia (Java) - III. / 21

Állománykiválasztó dialógus 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) Programozási technológia (Java) - III. / 22

Feladat FileChooserTest Készítsünk alkalmazást Java forrásállományok keresgélésére! Tegyünk a keretre két szövegmezőt és két nyomógombot: a szövegmezőkben az éppen kiválasztott könyvtár és Java állomány neve legyen, és egyiket se lehessen szerkeszteni! a Választ gomb lenyomására jelenjen meg az állománykiválasztó dialógus! A szövegmezők értéke ezután a kiválasztott könyvtár és állománynév legyen! A keret címe legyen a kiválasztott állomány teljes útvonala! A dialógus kezdeti könyvtára az aktuális könyvtár legyen, ezután pedig mindig az előző állapot jelenjen meg! a Kilép gombra csukjuk be a keretet! Programozási technológia (Java) - III. / 23

:FileChooserTest (ActionListener) btvalaszt (ActionEvent) import javax.swing.*; import javax.swing.filechooser.filefilter; import java.awt.*; import java.awt.event.*; import java.io.*; btkilep (ActionEvent) :JDialog Programozási technológia (Java) - III. / 24

class JavaFilter extends FileFilter { public boolean accept(file f) { return f.getname().touppercase().endswith(".java") f.isdirectory(); public String getdescription() { return "Java fájlok"; Programozási technológia (Java) - III. / 25

public class FileChooserTest extends JFrame implements ActionListener { private Container cp = getcontentpane(); private JTextField tfdir, tffile; private JButton btvalaszt, btkilep; private JFileChooser fc = new JFileChooser(); public FileChooserTest() { setlocation(200,100); setdefaultcloseoperation(exit_on_close); fc.setcurrentdirectory(new File(".")); fc.setfilefilter(new JavaFilter()); Programozási technológia (Java) - III. / 26

JPanel pninfo = new JPanel(); pninfo.add(new JLabel("Könyvtár: ")); pninfo.add(tfdir = new JTextField(40)); pninfo.add(new JLabel("Fájlnév: ")); pninfo.add(tffile = new JTextField(15)); tfdir.setenabled(false); tffile.setenabled(false); cp.add(pninfo); JPanel pngombok = new JPanel(); pngombok.add(btvalaszt = new JButton("Választ")); pngombok.add(btkilep= new JButton("Kilép")); cp.add(pngombok, BorderLayout.SOUTH); Programozási technológia (Java) - III. / 27

btvalaszt.addactionlistener(this); btkilep.addactionlistener(this); pack(); show(); void update() { File sf = fc.getselectedfile(); if (sf!= null) { tfdir.settext(fc.getcurrentdirectory().getabsolutepath()); tffile.settext(sf.getname()); settitle(sf.getabsolutepath()); Programozási technológia (Java) - III. / 28

public void actionperformed(actionevent e) { if (e.getsource()==btvalaszt) { if (fc.showopendialog(this)== JFileChooser.APPROVE_OPTION) { update(); else if (e.getsource()==btkilep) System.exit(0); public static void main(string[] args) { new FileChooserTest(); // FileChooserTest Programozási technológia (Java) - III. / 29

14. Folyamok 1. A folyam fogalma 2. Bájtfolyam 3. Karakterfolyam, szöveges állomány 4. Adatfolyam 5. Pufferező folyam 6. Objektumfolyam Programozási technológia (Java) - III. / 30

java.lang.object +--File +--FilenameFilter +--InputStream +--ByteArrayInputStream +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 31 java.lang.object +--Reader +--InputStreamReader +--FileReader +--BufferedReader +--Writer +--OutputStreamWriter +--FileWriter +--PrintWriter +--BufferedWriter DataInput DataOutput +--RandomAccessFile java.io csomag

Programozási technológia (Java) - III. / 32 A folyam fogalma 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)

Fogalmak 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... Programozási technológia (Java) - III. / 33

Példa Kiviteli folyamlánc dos:dataoutputstream FileOutputStream Program, memória 12.4 dos.writedouble(12.4) true Tároló adatok.dat 'é' c=dis.readchar() Programozási technológia (Java) - III. / 34 dis:datainputstream FileInputStream Beviteli folyamlánc

Példa (folyt.) 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(); Programozási technológia (Java) - III. / 35

Bájtfolyam (byte stream) Í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 Programozási technológia (Java) - III. / 36

java.lang.object +--InputStream +--ByteArrayInputStream Bájtfolyamok +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 37

InputStream Ö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 Programozási technológia (Java) - III. / 38

OutputStream Ö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 Programozási technológia (Java) - III. / 39

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... Programozási technológia (Java) - III. / 40

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... Programozási technológia (Java) - III. / 41

Feladat CopyFile Másoljunk át egy megadott állományt ugyanabba a könyvtárba, egy másik állományba; az újabb állomány neve csak annyiban térjen el az eredetiétől, hogy a kiterjesztése előtt legyen egy ~ karakter! import java.io.*; 1. megoldás bevitel és kivitel bájtonként public class CopyFile1 { public static void main (String args[]) { String fsource = "c:/javaprog/work/proba/app.java"; String fdest; int index = fsource.lastindexof('.'); fdest = fsource.substring(0,index) + Programozási technológia (Java) - III. / 42 ".~"+fsource.substring(index+1);

try { FileInputStream in = new FileInputStream(fSource); FileOutputStream out = new FileOutputStream(fDest); int b; while ((b = in.read())!= -1) { out.write(b); in.close(); out.close(); catch (IOException e) { System.out.println(e.getMessage()); // main // CopyFile1 Programozási technológia (Java) - III. / 43

2. megoldás bevitel és kivitel egy adagban byte[ ] bajttomb = new byte[in.available()]; in.read(bajttomb); out.write(bajttomb); 3. megoldás biztonságos lezárás FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream(fSource); out = new FileOutputStream(fDest); byte[ ] bajttomb = new byte[in.available()]; in.read(bajttomb); out.write(bajttomb); Programozási technológia (Java) - III. / 44

catch (IOException e) { System.out.println(e.getMessage()); finally { try { if (in!= null) in.close(); if (out!= null) out.close(); catch (IOException e) { System.out.println(e.getMessage()); Programozási technológia (Java) - III. / 45

Karakterfolyam (character stream) Í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 java.lang.object +--Reader +--InputStreamReader +--FileReader +--BufferedReader +--Writer +--OutputStreamWriter +--FileWriter +--PrintWriter +--BufferedWriter Programozási technológia (Java) - III. / 46 Karakterfolyamok

Programozási technológia (Java) - III. / 47 Reader Ö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

Programozási technológia (Java) - III. / 48 Writer Ö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 Csak olvasható karaktereket tartalmazó állomány Sorokból áll, a sorok pedig karakterekből Soros szervezésű Logikai szerkezet Állománymutató sor vége jel állomány vége jel E L S Ő <EOLN> 2 <EOLN> U T O L S Ó <EOLN> <EOF> Fizikai szerkezet (Windowsban) E L S Ő #13#10 2 #13#10 U T O L S Ó #13#10 #26 Programozási technológia (Java) - III. / 49

Szöveges állomány (folyt.) Á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 Programozási technológia (Java) - III. / 50

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... Programozási technológia (Java) - III. / 51

FileWriter - állományba író karakterfolyam Programozási technológia (Java) - III. / 52 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...

Feladat AppendAndList Készítsen egy programot, amellyel egy szöveges állományt lehet bővíteni (első alkalommal létrehozni), majd a konzolra kilistázni! Bővítéskor konzolról viszünk fel sorokat - végjel az üres szöveg. A szöveges állomány legyen a work/szoveg.txt! import java.io.*; import extra.console; public class AppendAndList { private String path; public AppendAndList(String path) { this.path = path; appendtext(); listtext(); Programozási technológia (Java) - III. / 53

void appendtext() { try { FileWriter fw = new FileWriter(path,true); String line; while (!(line = Console.readLine()).equals("")) { fw.write(line+"\r\n"); fw.close(); catch (IOException ex) { System.out.println(ex); Programozási technológia (Java) - III. / 54

void listtext() { try { FileReader fr = new FileReader(path); System.out.println("Lista:"); while (fr.ready()) System.out.print((char)fr.read()); fr.close(); catch (IOException ex) { System.out.println(ex); public static void main (String args[]) { new AppendAndList("work/Szoveg.txt"); // main // AppendAndList Programozási technológia (Java) - III. / 55

Programozási technológia (Java) - III. / 56 PrintWriter 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 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();

Programozási technológia (Java) - III. / 57 Adatfolyam (data stream) Í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

java.lang.object +--InputStream +--ByteArrayInputStream Bájtfolyamok +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 58

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 void writeutf(string s) throws IOException Programozási technológia (Java) - III. / 59

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) Programozási technológia (Java) - III. / 60

Feladat Egész számok írása, olvasása (SzamIrOlvas) Kérjünk be a felhasználótól int típusú értékeket, és írjuk fel őket egy állományba! Ezután listázzuk ki az egészeket a konzolra és vele párhuzamosan egy szöveges állományba is! import java.io.*; import extra.console; public class SzamIrOlvas { static void felvisz(string filename) { try { int szam = 0; System.out.println("Egesz szamok felvitele. Vegjel: -1"); DataOutputStream szamok=new DataOutputStream( Programozási technológia (Java) - III. / 61 new FileOutputStream(fileName+".dat"));

while ((szam=console.readint())!= -1) szamok.writeint(szam); szamok.close(); catch (IOException e) { System.out.println(e.getMessage()); static void listaz(string filename) { DataInputStream szamok = null; PrintWriter lista = null; int szam = 0; Programozási technológia (Java) - III. / 62

try { szamok = new DataInputStream( new FileInputStream(fileName+".dat")); lista = new PrintWriter( new FileOutputStream(fileName+".txt")); while (true) { szam = szamok.readint(); System.out.print(szam+" "); lista.print(szam+" "); catch (EOFException e) { catch (IOException e) { System.out.println(e.getMessage()); Programozási technológia (Java) - III. / 63

finally { try { szamok.close(); lista.close(); catch(ioexception e) { // listaz public static void main (String[] args) { String fnev="work/egeszek"; felvisz(fnev); listaz(fnev); // SzamIrOlvas Programozási technológia (Java) - III. / 64

Programozási technológia (Java) - III. / 65 Pufferező folyam 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) BufferedReader, BufferedWriter Karakterfolyamot pufferező beviteli/kiviteli folyam Konstruktorok BufferedReader(Reader in) BufferedReader(Reader in, int size) BufferedWriter(Writer out) BufferedWriter(Writer out, int size)

java.lang.object +--File +--FilenameFilter +--InputStream +--ByteArrayInputStream +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 66 java.lang.object +--Reader +--InputStreamReader +--FileReader +--BufferedReader +--Writer +--OutputStreamWriter +--FileWriter +--PrintWriter +--BufferedWriter DataInput DataOutput +--RandomAccessFile java.io csomag

Példa Program (memória) 12 'a' 5.2F t os3: DataOutputStream writeint(int) is3: DataInputStream readint() 0 0 0 12 0 97 64 166 102 102 1 os2: BufferedOutputStream write(byte) is2: BufferedInputStream read(byte) 0 0 0 12 0 97 64 166 102 102 1 os1: FileOutputStream write(block) is1: FileInputStream read(block) Fájl: adatok.dat 0 0 0 12 0 97 64 166 102 102 1 Programozási technológia (Java) - III. / 67

Példa (folyt.) Adatok kírása 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(); Programozási technológia (Java) - III. / 68

Példa (folyt.) Adatok visszaolvasása 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(); Programozási technológia (Java) - III. / 69

Objektumfolyam (object stream) Í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 Programozási technológia (Java) - III. / 70

java.lang.object +--InputStream +--ByteArrayInputStream Bájtfolyamok +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 71

ObjectOutputStream OutputStream DataOutput ObjectOutput +writeobject(o:object) {IOException ObjectOutputStream +ObjectOutputStream(out:OutputStream) {IOEx. +writeobject(obj:object) {IOEx., pl.:notserializableexception +writeboolean(b:boolean) {IOException +writebyte(b:byte) {IOException +writechar(c:char) {IOException +writeint(i: int) {IOException... +close() {IOException... Programozási technológia (Java) - III. / 72

ObjectInputStream InputStream DataInput ObjectInput +readobject():object {IOException, ClassNotFoundException ObjectInputStream +ObjectInputStream(in:InputStream) {IOEx. +readobject():object {IOEx., ClassNotFoundException +readboolean():boolean {IOEx. +readbyte():byte {IOEx. +readchar():char {IOEx. +readint():int {IOEx.... +close() {IOEx.... Programozási technológia (Java) - III. / 73

Egy objektum szerializálásának szabályai 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) 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 Programozási technológia (Java) - III. / 74

Feladat Objektumok elmentése és visszaolvasása (ObjectStreamDemo) Í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! Programozási technológia (Java) - III. / 75

Serializable... String tostring():string... n: int MyClass tostring():string s1:string s2:string i:int obj:myclass Rolád Roland Telivér Olivér 54321 67 objektumok.dat Programozási technológia (Java) - III. / 76

import java.io.*; class MyClass implements Serializable { int n=67; public String tostring() { return Integer.toString(n); Programozási technológia (Java) - III. / 77

public class ObjStreamDemo { static void letrehoz() { try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("work/objektumok.dat")); out.writeobject(new String("Rolád Roland")); out.writeobject(new String("Telivér Olivér")); out.writeint(54321); out.writeobject(new MyClass()); out.close(); catch (FileNotFoundException ex) { System.out.println("Az állományt nem lehet létrehozni!"); Programozási technológia (Java) - III. / 78

catch (IOException ex) { System.out.println("I/O hiba! "+ex); static void listaz() { try { ObjectInputStream in = new ObjectInputStream( new FileInputStream("work/objektumok.dat")); String s1 = (String) in.readobject(); String s2 = (String) in.readobject(); int i = in.readint(); MyClass obj = (MyClass) in.readobject(); in.close(); System.out.println(s1+" "+s2+" "+i+" "+obj); Programozási technológia (Java) - III. / 79

catch (FileNotFoundException ex) { System.out.println("Nincs ilyen állomány!"); catch (ClassNotFoundException ex) { System.out.println("Rossz osztály!"); catch (IOException ex) { System.out.println("I/O hiba! "+ex); public static void main(string[] args) { letrehoz(); listaz(); Programozási technológia (Java) - III. / 80

15. Közvetlen hozzáférésű állomány 1. Állományszervezési és -hozzáférési módok 2. A RandomAccessFile osztály Programozási technológia (Java) - III. / 81

Állományhozzáférési (elérési) módok Soros hozzáférés Szekvenciális hozzáférés Közvetlen hozzáférés Állományszervezési módok Soros szervezés (Pl.: folyamok) Közvetlen szervezés (Pl.: RandomAccessFile) Véletlen (hasító) szervezés Indexelt szekvenciális szervezés Programozási technológia (Java) - III. / 82

RandomAccessFile osztály Közvetlen hozzáférésű állomány Írható és olvasható egyszerre Írás/olvasás egysége: bájt, primitív adat vagy String (tetszőleges objektum nem lehet!) Állománymutató (állománypozíció, file pointer) Értéke: állomány elejétől számított bájtsorszám Lekérdezhető, beállítható Olvasó, író utasítások állítják Programozási technológia (Java) - III. / 83

java.lang.object +--File +--FilenameFilter +--InputStream +--ByteArrayInputStream +--FileInputStream +--FilterInputStream +--DataInputStream DataInput +--BufferedInputStream... +--ObjectInputStream ObjectInput... +--OutputStream +--ByteArrayOutputStream +--FileOutputStream +--FilterOutputStream +--DataOutputStream DataOutput +--BufferedOutputStream +--PrintStream... +--ObjectOutputStream ObjectOutput... Programozási technológia (Java) - III. / 84 java.lang.object +--Reader +--InputStreamReader +--FileReader +--BufferedReader +--Writer +--OutputStreamWriter +--FileWriter +--PrintWriter +--BufferedWriter DataInput DataOutput +--RandomAccessFile java.io csomag

Példa adatok.dat Fájlmutató 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 E l e j e X 1 9 0 8 V é readchar() ch X RandomAccessFile raf = new RandomAccessFile("adatok.dat","rw"); raf.writechars("elejex1908vege"); long hossz = raf.length(); // hossz==28 raf.seek(10); char ch = raf.readchar(); // ch=='x' raf.writechar(ch); long poz = raf.getfilepointer(); // poz==14 Programozási technológia (Java) - III. / 85 X writechar(ch) g e

Konstruktorok RandomAccessFile(String name, String mode) throws FileNotFoundException RandomAccessFile(File file, String mode) throws FileNotFoundException mode: "r" vagy "rw" Metódusok long getfilepointer() throws IOException void seek(long pos) throws IOException int skipbytes(int n) throws IOException long length() throws IOException void setlength(long newlength) throws IOException Programozási technológia (Java) - III. / 86

Metódusok int read() throws IOException, EOFException boolean readboolean() throws IOException String readline() throws IOException String readutf() throws IOException void write(int b) throws IOException void writeboolean(boolean v) throws IOException void writebytes(string s) throws IOException void writechars(string s) throws IOException void writeutf(string s) throws IOException void close() throws IOException Programozási technológia (Java) - III. / 87

Feladat Hőmérsékletek A hónap minden napján délben egytized fok pontossággal megmérjük a levegő hőmérsékletét. Vigyük fel az adatokat egy HaviHomers.dat állományba! Ezután listázzuk ki az állományt, és írjuk ki a havi átlaghőmérsékletet! Kérdezhesse meg a felhasználó, hogy melyik napon mekkora volt a hőmérséklet! Ha rossz napot üt be, akkor írjuk ki, hogy "Nem jó nap!"; ha nullát üt be, akkor fejezzük be a programot! A hőmérsékletadatok a program befejezése után se vesszenek el! Programozási technológia (Java) - III. / 88

public class Homersekletek { static void felvisz() { try { DataOutputStream havihom = new DataOutputStream( new FileOutputStream("work/HaviHomers.dat")); for (int i=0; i<31; i++) { double hom = (int)(math.random()*100)/10.0+10; havihom.writedouble(hom); havihom.close(); catch (IOException ex) { System.out.println(ex); // felvisz Programozási technológia (Java) - III. / 89

static void kerdez() { try { RandomAccessFile havihom = new RandomAccessFile("work/HaviHomers.dat","r"); System.out.println("Hőmérsékletek a hónapban"); int i=0; double osszeg = 0; try { while (true) { double hom = havihom.readdouble(); i++; osszeg += hom; if (i%8==0) System.out.println(); System.out.print(i+": "+hom+"\t"); // while Programozási technológia (Java) - III. / 90

catch (EOFException ex) { System.out.println("\nÁtlaghőmérséklet 2 tizedesre: "+ ((int)(osszeg/31*100)/100.0)); System.out.println("\n\nKérdezzen 0 végjelig!"); long poz; while ((poz = Console.readInt("\nNap: "))!= 0) { try { havihom.seek(8*(poz-1)); System.out.println(havihom.readDouble()); catch (IOException e) { System.out.println("Nem jó nap!"); // while Programozási technológia (Java) - III. / 91

havihom.close(); // külső try catch (IOException ex) { System.out.println(ex); // kerdez public static void main(string[] args) { felvisz(); kerdez(); // Homersekletek Programozási technológia (Java) - III. / 92