Práce se soubory v Javě

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Zápis a načtení objektu: Oprava kódu - write<Object>)
m (Opraven vzhled, ponecháno pouze pro manipulaci se soubory.)
 
(Nejsou zobrazeny 3 mezilehlé verze od 1 uživatele.)
Řá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> ==
 
* odkazuje na soubor jako celek
 
* odkazuje na soubor jako celek
 
* reprezentuje vlastně název souboru a cestu k němu (nikoli data souboru)
 
* reprezentuje vlastně název souboru a cestu k němu (nikoli data souboru)
* vytvoření odkazu na soubor/cestu
 
*:<code>File vystupniSoubor = new File(nazevSouboru.pripona);</code>
 
-----
 
* 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 ===
+
== Vytvoření odkazu na soubor/cestu ==
* binární data (obecná data, tedy libovolná posloupnost byte)
+
* <code>File vystupniSoubor = new File(nazevSouboru.pripona);</code>
** FileOutputStream
+
** FileInputStream
+
* textová data
+
** BufferedWriter
+
** BufferedReader
+
** Scanner
+
  
== Serializace ==
 
  
=== Co je to serializace? ===
+
== Vytvoření a ověření existence souboru ==
* V objektovém programování pracujeme s objekty, které obsahují atributy.
+
* <code>boolean createNewFile()</code>
* 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.
+
* <code>boolean dbFile.exists()</code>
* Pokud do souboru chceme ukládat složitější data (objekty), musí je naše aplikace převést na posloupnost byte.
+
* <code>boolean createNewFile()</code>
* Převod můžeme provést vlastními prostředky, ale musíme si pro to naprogramovat patřičné metody.
+
* <code>boolean isDirectory()</code>
* 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.
+
* <code>long length()</code>
  
=== 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 ===
+
== Operace se soubory ==
 +
* <code>renameTo(File novy)</code>
 +
* <code>delete()</code>
  
<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>
+
== Práce s adresáři ==
 +
* Podobně jako v&nbsp;Unixu/Linuxu je adresář chápán jako speciální soubor.
 +
* <code>File[] listFiles()</code>
 +
* <code>mkdir(File nazev)</code>
  
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''
 
</code>
 
  
Přečtení instance třídy <tt>Poznamka</tt> ze souboru na cestě <tt>cestaANazevSouboru</tt>:
+
== Související stránky ==  
<code>
+
Čtení obsahu souboru a zápis do souboru je na následujících stránkách:
  Poznamka pozn;
+
* [[Java: Textový vstup a výstup]]... textové vstupy a výstupy - soubory *.csv, *.txt,...,
 
+
* [[Serializace]]... ukládání celých objektů v binárním tvaru.
  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();
+
</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].

Aktuální verze z 17. 3. 2020, 11:26


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

Vytvoření odkazu na soubor/cestu


Vytvoření a ověření existence souboru


Operace se soubory

Práce s adresáři


Související stránky

Čtení obsahu souboru a zápis do souboru je na následujících stránkách:


Další zdroje

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