Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 1 13.Állományok, bejegyzések 14.Folyamok 15.Közvetlen hozzáférésű állomány
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / Á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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 3 java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInput DataOutput | +--RandomAccessFile java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... java.io csomag
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 4 Útvonalak Absztrakt / valódi útvonal A valódi útvonal részei Prefix: " "/"(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 Aktuális könyvtárRelatív útvonal Abszolút útvonal Név Gyermek útvonal Szülő útvonal c:\javaprog\work\icons\insert.gif
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 5 File osztály Bejegyzést reprezentál A bejegyzést útvonalával azonosítja Konstruktorok File(String pathname) File(String parent, String child) File(File parent, String child) Mezők static String separator static char separatorChar static String pathSeparator static char pathSeparatorChar
Gábor Dénes Főiskola (IAI)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()
Gábor Dénes Főiskola (IAI)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()
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 8 File osztály (folyt.) Metódusok - Karbantartás boolean mkdir() boolean mkdirs() boolean createNewFile() throws IOException boolean delete() void deleteOnExit() boolean renameTo(File dest)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 9 File osztály (folyt.) Metódusok - Egyéb equals(Object o) compareTo(File pathName) compareTo(Object o) String toString() Metódusok - Bejegyzéslisták String[] list() String[] list(FilenameFilter filter) File[] listFiles() File[] listFiles(FilenameFilter filter) static File[] listRoots()
Gábor Dénes Főiskola (IAI)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!
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 11 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(); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 12 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();
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 13 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.");
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 14 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 15 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!
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 16 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); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 17 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; }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 18 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 19 Állománykiválasztó dialógus – JFileChooser Szűrő Fájlnév Könyvtár Könyvtárlista
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 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 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.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 21 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 – JFileChooser (folyt.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 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.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 23 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!
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 24 import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.awt.*; import java.awt.event.*; import java.io.*; btValaszt (ActionEvent) :FileChooserTest (ActionListener) :JDialog btKilep (ActionEvent)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 25 class JavaFilter extends FileFilter { public boolean accept(File f) { returnf.getName().toUpperCase().endsWith(".JAVA") || f.isDirectory(); } public String getDescription() { return "Java fájlok"; }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 26 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());
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 27 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);
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 28 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()); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 29 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / Folyamok 1.A folyam fogalma 2.Bájtfolyam 3.Karakterfolyam, szöveges állomány 4. Adatfolyam 5.Pufferező folyam 6.Objektumfolyam
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 31 java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInput DataOutput | +--RandomAccessFile java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... java.io csomag
Gábor Dénes Főiskola (IAI)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)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 33 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...
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 34 Beviteli folyamlánc Kiviteli folyamlánc Tároló adatok.dat Program, memória FileOutputStreamdos:DataOutputStream true 'é' FileInputStreamdis:DataInputStream c=dis.readChar() dos.writeDouble(12.4) 12.4 Példa
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 35 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(); Példa (folyt.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 36 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 37 java.lang.Object +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... Bájtfolyamok
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 38 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 39 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 40 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}...
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 41 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}... FileOutputStream - állományba író bájtfolyam
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 42 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.*; 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) + ".~"+fSource.substring(index+1); 1. megoldás – bevitel és kivitel bájtonként
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 43 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 44 byte[ ] bajtTomb = new byte[in.available()]; in.read(bajtTomb); out.write(bajtTomb); 2. megoldás – bevitel és kivitel egy adagban3. 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); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 45 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()); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 46 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 Karakterfolyamok
Gábor Dénes Főiskola (IAI)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
Gábor Dénes Főiskola (IAI)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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 49 Szöveges állomány Csak olvasható karaktereket tartalmazó állomány Sorokból áll, a sorok pedig karakterekből Soros szervezésű ELSŐ 2UTOLSÓ ELSŐ2UTOLSÓ #13#10#13#10#13#10#26 Logikai szerkezet Fizikai szerkezet (Windowsban) „sor vége” jel„állomány vége” jelÁllománymutató
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 50 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 51 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}...
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 52 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}...
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 53 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(); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 54 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); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 55 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
Gábor Dénes Főiskola (IAI)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();
Gábor Dénes Főiskola (IAI)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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 58 java.lang.Object +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... Bájtfolyamok
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 59 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 60 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)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 61 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( new FileOutputStream(fileName+".dat"));
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 62 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;
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 63 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()); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 64 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
Gábor Dénes Főiskola (IAI)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)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 66 java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInput DataOutput | +--RandomAccessFile java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... java.io csomag
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 67 Példa os2: BufferedOutputStream write(byte) os1: FileOutputStream write(block) os3: DataOutputStream writeInt(int) 'a'5.2Ft Fájl: adatok.dat is2: BufferedInputStream read(byte) is1: FileInputStream read(block) is3: DataInputStream readInt() Program (memória)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 68 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(); Példa (folyt.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 69 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(); Példa (folyt.)
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 70 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 71 java.lang.Object +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... Bájtfolyamok
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 72 ObjectOutputStream OutputStream 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}... DataOutput ObjectOutput +writeObject(o:Object) {IOException} …
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 73 ObjectInputStream InputStream ObjectInputStream +ObjectInputStream(in:InputStream) {IOEx.} +readObject():Object {IOEx., ClassNotFoundException} +readBoolean():boolean {IOEx.} +readByte():byte {IOEx.} +readChar():char {IOEx.} +readInt():int {IOEx.}... +close() {IOEx.}... DataInput ObjectInput +readObject():Object {IOException, ClassNotFoundException} …
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 74 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 75 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!
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 76 Serializable s1:String s2:String obj:MyClass String toString():String... i:int Rolád RolandTelivér Olivér MyClass toString():String n: int objektumok.dat
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 77 import java.io.*; class MyClass implements Serializable { int n=67; public String toString() { return Integer.toString(n); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 78 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!"); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 79 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); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 80 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(); }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / Közvetlen hozzáférésű állomány 1.Állományszervezési és -hozzáférési módok 2.A RandomAccessFile osztály
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 82 Á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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 83 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 84 java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInput DataOutput | +--RandomAccessFile java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | |... | +--ObjectInputStream ObjectInput | OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | |... | +--ObjectOutputStream ObjectOutput |... java.io csomag
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 85 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 Példa X ElejeX098éVeg readChar() ch X writeChar(ch) Fájlmutató adatok.dat
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 86 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 87 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 88 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!
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 89 … 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)/ ; havihom.writeDouble(hom); } havihom.close(); } catch (IOException ex) { System.out.println(ex); } } // felvisz
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 90 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 }
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 91 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
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 92 havihom.close(); } // külső try catch (IOException ex) { System.out.println(ex); } } // kerdez public static void main(String[] args) { felvisz(); kerdez(); } } // Homersekletek