920 likes | 1.03k Views
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
E N D
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 6. Állománykiválasztó dialógus – JFileChooser 7. Könyvtár felderítése rekurzióval
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 | ...
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
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)
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()
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)
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()
Á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(); }
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();
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.");
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
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!
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); } }
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; }
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
Könyvtárlista Könyvtár Fájlnév Szűrő Állománykiválasztó dialógus – JFileChooser
Á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
Á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
Á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)
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!
: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.*;
class JavaFilter extends FileFilter { public boolean accept(File f) { return f.getName().toUpperCase().endsWith(".JAVA") || f.isDirectory(); } public String getDescription() { return "Java fájlok"; } }
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());
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);
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()); } }
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
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
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 | ...
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...
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
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();
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
Bájtfolyamok java.lang.Object +--InputStream | +--ByteArrayInputStream | +--FileInputStream | +--FilterInputStream | | +--DataInputStream DataInput | | +--BufferedInputStream | | ... | +--ObjectInputStream ObjectInput | ... +--OutputStream | +--ByteArrayOutputStream | +--FileOutputStream | +--FilterOutputStream | | +--DataOutputStream DataOutput | | +--BufferedOutputStream | | +--PrintStream | | ... | +--ObjectOutputStream ObjectOutput | ...
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
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
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
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
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!
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
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); }
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()); } }
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
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
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
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ű
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