Práce se soubory v Javě
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (Vytvoření první části: manipulace se soubory) |  (Doplnění zápisu obsahu souborů a serializace) | ||
| Řádka 2: | Řádka 2: | ||
| [[Category:Informatika]] | [[Category:Informatika]] | ||
| [[Category:Programování]] | [[Category:Programování]] | ||
| + | |||
| + | Pro podrobnější přehled o způsobech zápisu si pročtete [http://download.oracle.com/javase/tutorial/essential/io/file.html tutoriál ze stránek firmy Oracle]. | ||
| == Manipulace se soubory == | == Manipulace se soubory == | ||
| Řádka 26: | Řádka 28: | ||
| ** mkdir(File nazev) | ** 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 | ||
| + | ** BufferedWriter | ||
| == Serializace == | == 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í <code>Serializable</code>. | ||
| + | * Pro převod instance na posloupnost byte při zápisu použijeme třídu <code>ObjectOutputStream</code> pro zpětný převod při čtení třídu <code>ObjectInputStream</code>. | ||
| + | |||
| + | === 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. | ||
| + | |||
| + | <code> | ||
| + |    Poznamka pozn = new Poznamka(); | ||
| + | |||
| + |    File file = new File("cestaANazevSouboru"); | ||
| + |    FileOutputStream fos = new FileOutputStream(file); | ||
| + |    ObjectOutputStream objOut = new ObjectOutputStream(fos); | ||
| + | |||
| + |    objOut.write (pozn); | ||
| + | |||
| + |    objOut.close(); | ||
| + | </code> | ||
| + | |||
| + | <code> | ||
| + |    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(); | ||
| + | </code> | ||
| + | |||
| + | === Příklad: poznámkový blok === | ||
| + | * Máme třídu <code>Poznamka</code>, 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 <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á. | ||
Verze z 22. 7. 2011, 13:46
Pro podrobnější přehled o způsobech zápisu si pročtete tutoriál ze stránek firmy Oracle.
| Obsah | 
Manipulace se soubory
  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
- BufferedWriter
 
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
