1 / 92

III. Állománykezelés

III. Állománykezelés. 13. Állományok, bejegyzések 14. Folyamok 15. Közvetlen hozzáférésű állomány. III. Állománykezelés. 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

linh
Download Presentation

III. Állománykezelés

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. III. Állománykezelés 13. Állományok, bejegyzések 14. Folyamok 15. Közvetlen hozzáférésű állomány

  2. III. Állománykezelés 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

  3. java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInputDataOutput | | +--RandomAccessFile java.io csomag java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | | ... | +--ObjectInputStream ObjectInput | ... +--OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | | ... | +--ObjectOutputStream ObjectOutput | ...

  4. Abszolút útvonal Aktuális könyvtár Relatív útvonal Név • c:\javaprog\work\icons\insert.gif Szülő útvonal Gyermek útvonal Ú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 / relatív • Szülő / gyermek

  5. File osztály • Bejegyzést reprezentál • A bejegyzést útvonalával azonosítja • Mezők • static String separatorstatic char separatorChar • static String pathSeparatorstatic char pathSeparatorChar • Konstruktorok • File(String pathname) • File(String parent, String child)File(File parent, String child)

  6. File osztály (folyt.) • Metódusok - A bejegyzés útvonala • boolean isAbsolute() • String getAbsolutePath()File getAbsoluteFile() • String getPath() • String getCanonicalPath() throws IOExceptionFile getCanonicalFile() throws IOException • String getParent()File getParentFile() • String getName()

  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()

  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)

  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() • Metódusok - Egyéb • equals(Object o)compareTo(File pathName)compareTo(Object o) • String toString()

  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!

  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(); }

  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();

  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.");

  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

  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!

  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); } }

  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; }

  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

  19. Könyvtárlista Könyvtár Fájlnév Szűrő Állománykiválasztó dialógus – JFileChooser

  20. Á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

  21. Á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 selectedFileFile[]selectedFiles

  22. Á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)

  23. Feladat – FileChooserTest • Készítsünk alkalmazástJava 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őkbenaz é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!

  24. :FileChooserTest(ActionListener) btKilep(ActionEvent) btValaszt(ActionEvent) :JDialog import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.awt.*; import java.awt.event.*; import java.io.*;

  25. class JavaFilter extends FileFilter { public boolean accept(File f) { return f.getName().toUpperCase().endsWith(".JAVA") || f.isDirectory(); } public String getDescription() { return "Java fájlok"; } }

  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());

  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);

  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()); } }

  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

  30. III. Állománykezelés 14. Folyamok 1. A folyam fogalma 2. Bájtfolyam 3. Karakterfolyam, szöveges állomány 4. Adatfolyam 5. Pufferező folyam 6. Objektumfolyam

  31. java.lang.Object +--Reader | +--InputStreamReader | | +--FileReader | +--BufferedReader +--Writer | +--OutputStreamWriter | | +--FileWriter | +--PrintWriter | +--BufferedWriter | | DataInputDataOutput | | +--RandomAccessFile java.io csomag java.lang.Object +--File +--FilenameFilter +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | | ... | +--ObjectInputStream ObjectInput | ... +--OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | | ... | +--ObjectOutputStream ObjectOutput | ...

  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)

  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...

  34. Kiviteli folyamlánc dos:DataOutputStream FileOutputStream Program, memória dos.writeDouble(12.4) 12.4 true 'é' c=dis.readChar() Tárolóadatok.dat dis:DataInputStream FileInputStream Beviteli folyamlánc Példa

  35. 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();

  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

  37. Bájtfolyamok java.lang.Object +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | | ... | +--ObjectInputStream ObjectInput | ... +--OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | | ... | +--ObjectOutputStream ObjectOutput | ...

  38. InputStream • Összes beviteli bájtfolyam absztrakt őse • Metódusok • abstract int read() throws IOException • int read(byte[] b) throws IOExceptionint read(byte[] b, int off, int len) throws IOException • int available() throws IOException • long skip(long n) throws IOException • void close() throws IOException

  39. OutputStream • Összes kiviteli bájtfolyam absztrakt őse • Metódusok • abstract void write(int b) throws IOException • void write(byte[] b) throws IOExceptionvoid write(byte[] b, int off, int len) throws IOException • void flush() throws IOException • void close() throws IOException

  40. 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} ... FileInputStream - állományból olvasó bájtfolyam

  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

  42. 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 • 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!

  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

  44. 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); }

  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()); } }

  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

  47. Reader • Összes beviteli karakterfolyam absztrakt őse • Metódusok • int read() throws IOException • int read(char[] cbuf) throws IOExceptionabstract int read(char[] cbuf,int off, int len) throws IOException • boolean ready() throws IOException • long skip(long n) throws IOException • abstract void close() throws IOException

  48. Writer • Összes kiviteli karakterfolyam absztrakt őse • Metódusok • void write(int c) throws IOException • void write(char[] cbuf) throws IOExceptionabstract void write(char[] cbuf, int off, int len) throws IOException • void write(String str) throws IOExceptionvoid write(String str, int off, int len) throws IOException • abstract void flush() throws IOException • abstract void close() throws IOException

  49. 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> E L S Ő #13 #10 2 #13 #10 U T O L S Ó #13 #10 #26 Fizikai szerkezet (Windowsban) Szöveges állomány • Csak olvasható karaktereket tartalmazó állomány • Sorokból áll, a sorok pedig karakterekből • Soros szervezésű

  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

More Related