Práce se soubory v Javě

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Přístup k obsahu souboru: Přidán odkaz na Textový vstup a výstup a Serializaci)
(Osamostatněna Serializace, vyhozena úvodní varování, jsou obsaženy i v dalším textu.)
Řádka 1: Řádka 1:
 
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]]
 
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]]
<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>
 
 
<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 ==
  
 
<div class="Poznamka">V nově vytvářených projektech zvažte použití  
 
<div class="Poznamka">V nově vytvářených projektech zvažte použití  
[http://download.oracle.com/javase/tutorial/essential/io/legacy.html rozhraní (interface) <code>java.nio.file.Path</code> a třídy <code>java.nio.file.Files</code>].</div>
+
[http://download.oracle.com/javase/tutorial/essential/io/legacy.html rozhraní (interface) <code>java.nio.file.Path</code> a třídy <code>java.nio.file.Files</code>] (vyžaduje Java SE 7).</div>
  
 
=== Třída <code>java.io.File</code> ===
 
=== Třída <code>java.io.File</code> ===
Řádka 47: Řádka 44:
 
* [[Serializace]]... ukládání celých objektů v binárním tvaru.
 
* [[Serializace]]... ukládání celých objektů v binárním tvaru.
  
== 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 ===
 
 
<div class="Poznamka">Následující kód je zjednodušený, neřeší ošetření vyjímek. Jde nám o schéma použití serializace.</div>
 
 
Zápis instance třídy <tt>Poznamka</tt> do souboru na cestě <tt>cestaANazevSouboru</tt>:
 
<code>
 
  Poznamka pozn = new Poznamka();
 
 
 
  File file = new File("''cestaANazevSouboru''");         
 
      ''// Označuje soubor (uchovává cestu)''
 
  FileOutputStream fos = new FileOutputStream(file);     
 
      ''// Otevře soubor pro zápis''
 
  ObjectOutputStream objOut = new ObjectOutputStream(fos);
 
      ''// Provádí převod objektů na posloupnost byte (serializaci)''
 
 
 
  objOut.writeObject(pozn); ''//Zápis samotný''
 
 
 
  objOut.close(); ''//Uzavření souboru''
 
  fos.close(); ''//Uzavření souboru''
 
</code>
 
 
Přečtení instance třídy <tt>Poznamka</tt> ze souboru na cestě <tt>cestaANazevSouboru</tt>:
 
<code>
 
  Poznamka pozn;
 
 
 
  File file = new File("cestaANazevSouboru");
 
  FileInputStream fis = new FileInputStream(file);
 
  ObjectInputStream objIn = new ObjectInputStream(fis);
 
 
 
  pozn = (Poznamka) objIn.readObject();
 
      ''// lépe by bylo ověřit správnou třídu pomocí instance_of''
 
 
 
  objIn.close();
 
  fis.close(); ''//Uzavření souboru''
 
</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á.
 
  
 
== Další zdroje ==
 
== Další zdroje ==
 
* [http://download.oracle.com/javase/tutorial/essential/io/file.html Oracle: Reading, Writing, and Creating Files]
 
* [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].
 
* [http://www.javapractices.com/topic/TopicAction.do?Id=42 JavaPractices.com: Reading and Writing Text Files].

Verze z 19. 5. 2014, 08:35


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 (vyžaduje Java SE 7).

Třída java.io.File




Přístup k obsahu souboru

Příklady vstupně-výstupních proudů

Podrobněji viz:


Další zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje