Práce se soubory v Javě
Z MiS
(Rozdíly mezi verzemi)
(Přidány odkazy na java.nio.file.*) |
(Aktualizace odkazů na zdroje) |
||
| Řádka 1: | Řádka 1: | ||
| − | [[Category:VSE]] | + | [[Category:VSE]][[Category:Informatika]][[Category:Programování]] |
| − | [[Category:Informatika]] | + | <div class="Poznamka">Pro podrobnější přehled o způsobech zápisu si pročtete tutoriály: [http://download.oracle.com/javase/tutorial/essential/io/file.html Práce se soubory] a [http://www.javapractices.com/topic/TopicAction.do?Id=42 Práce s textovými soubory]. (Viz také [[#Další_zdroje|Další zdroje]].)</div> |
| − | [[Category:Programování]] | + | |
| − | + | <div class="Varovani">Pozor!!! Od verze Java SE 7 zvažte použití [http://download.oracle.com/javase/tutorial/essential/io/legacy.html tříd z balíčku java.nio.file]!!!</div> | |
| − | + | ||
| − | + | ||
== Manipulace se soubory == | == Manipulace se soubory == | ||
| Řádka 45: | Řádka 42: | ||
** BufferedWriter | ** BufferedWriter | ||
** BufferedReader | ** BufferedReader | ||
| + | ** Scanner | ||
== Serializace == | == Serializace == | ||
| Řádka 94: | Řádka 92: | ||
*#: pro ukládání a čtení si ale musíme připravit metody, které vyřeší třeba situaci, kdy je středník součástí poznámky samotné. | *#: pro ukládání a čtení si ale musíme připravit metody, které vyřeší třeba situaci, kdy je středník součástí poznámky samotné. | ||
*# použít serializaci. Pak stačí, když třída <code>Poznamka</code> implementuje rozhraní <code>Serializable</code>, protože <code>String</code> i <code>Date</code> toto rozhraní také implementují a jiné atributy třída <code>Poznamka</code> nemá. | *# použít serializaci. Pak stačí, když třída <code>Poznamka</code> implementuje rozhraní <code>Serializable</code>, protože <code>String</code> i <code>Date</code> toto rozhraní také implementují a jiné atributy třída <code>Poznamka</code> nemá. | ||
| + | |||
| + | == Další zdroje == | ||
| + | * [http://download.oracle.com/javase/tutorial/essential/io/file.html Oracle: Reading, Writing, and Creating Files] | ||
| + | * [http://www.javapractices.com/topic/TopicAction.do?Id=42 JavaPractices.com: Reading and Writing Text Files]. | ||
Verze z 25. 2. 2013, 10:47
Pro podrobnější přehled o způsobech zápisu si pročtete tutoriály: Práce se soubory a Práce s textovými soubory. (Viz také Další zdroje.)
Pozor!!! Od verze Java SE 7 zvažte použití tříd z balíčku java.nio.file!!!
Obsah |
Manipulace se soubory
V nově vytvářených projektech zvažte použití
rozhraní (interface)
java.nio.file.Path a třídy java.nio.file.Files. Třída java.io.File
- odkazuje na soubor jako celek
- reprezentuje vlastně název souboru a cestu k němu (nikoli data souboru)
- vytvoření odkazu na soubor/cestu
File vystupniSoubor = new File(nazevSouboru.pripona);
- vytvoření, zjištění informací
- boolean createNewFile()
- boolean dbFile.exists()
- boolean createNewFile()
- boolean isDirectory()
- long length()
- operace se soubory (celými, nikoli s daty v nich)
- renameTo(File novy)
- delete()
- Práce s adresáři (protože adresář je také speciální soubor)
- File[] listFiles()
- mkdir(File nazev)
Přístup k obsahu souboru
- Pro přístup k obsahu souboru se v Javě používají vstupně-výstupní proudy (angl. stream).
- Vstupní (výstupní) proud je vlastně třída, která umožňuje zapisovat (číst) data z (do) souboru.
Příklady
- binární data (obecná data, tedy libovolná posloupnost byte)
- FileOutputStream
- FileInputStream
- textová data
- BufferedWriter
- BufferedReader
- Scanner
Serializace
Co je to serializace?
- V objektovém programování pracujeme s objekty, které obsahují atributy.
- Data souboru na disku jsou tvořena posloupností byte. Je na aplikaci, aby věděla, co tyto byte znamenají. Objekty do souborů ukládat přímo nelze.
- Pokud do souboru chceme ukládat složitější data (objekty), musí je naše aplikace převést na posloupnost byte.
- Převod můžeme provést vlastními prostředky, ale musíme si pro to naprogramovat patřičné metody.
- Výhodnější je nechat převod na Javě. Můžeme k tomu využít tzv. serializaci, tedy automatický převod objektů na posloupnosti byte.
Jak serializace funguje?
- Třída, jejíž instance chceme ukládat do souboru, musí implementovat rozhraní
Serializable. - Pro převod instance na posloupnost byte při zápisu použijeme třídu
ObjectOutputStreampro zpětný převod při čtení tříduObjectInputStream.
Zápis a načtení objektu
Následující kód je zjednodušený, neřeší ošetření vyjímek. Jde nám o schéma použití serializace.
Poznamka pozn = new Poznamka();
File file = new File("cestaANazevSouboru");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream objOut = new ObjectOutputStream(fos);
objOut.write (pozn);
objOut.close();
Poznamka pozn;
File file = new File("cestaANazevSouboru");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream objIn = new ObjectInputStream(fis);
pozn = (Poznamka) objIn.read(); // lépe by bylo ověřit správnou třídu pomocí instance_of
objIn.close();
Příklad: poznámkový blok
- Máme třídu
Poznamka, která obsahuje text poznámky a datum vytvoření. - Máme 30 poznámek (instancí třídy) a chceme je uložit do souboru a později načíst.
- Můžeme tedy:
- zapsat data do textového souboru, kam na každý řádek zapíšeme jednu poznámku v textové podobě, pak středník a pak datum vytvoření ve formátu DD.MM.YYYY
- pro ukládání a čtení si ale musíme připravit metody, které vyřeší třeba situaci, kdy je středník součástí poznámky samotné.
- použít serializaci. Pak stačí, když třída
Poznamkaimplementuje rozhraníSerializable, protožeStringiDatetoto rozhraní také implementují a jiné atributy třídaPoznamkanemá.
- zapsat data do textového souboru, kam na každý řádek zapíšeme jednu poznámku v textové podobě, pak středník a pak datum vytvoření ve formátu DD.MM.YYYY