Java: Textový vstup a výstup

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Využití klauzule finally pro uzavírání souboru.)
(Opraveno na použití try-with-resources.)
 
(Nejsou zobrazeny 2 mezilehlé verze od 1 uživatele.)
Řádka 6: Řádka 6:
 
* Více o výjimkách si přečtete zde: [[Výjimky v Javě]].
 
* Více o výjimkách si přečtete zde: [[Výjimky v Javě]].
 
* Pro tuto chvíli bude stačit, když víte, že práci se soubory je vždy potřeba obklopit kódem pro řešení chyb:
 
* Pro tuto chvíli bude stačit, když víte, že práci se soubory je vždy potřeba obklopit kódem pro řešení chyb:
  try { ''// Začni provádět kód, ve kterém může nastat chybový stav...''
+
  try (''otevření souboru'') { ''// Otevři soubor a začni tím blok, ve kterém může nastat chybový stav...''
 
     ''... zde následuje kód, pracující se souborem...''
 
     ''... zde následuje kód, pracující se souborem...''
 
  } catch (IOException ex) {  
 
  } catch (IOException ex) {  
Řádka 14: Řádka 14:
 
  }  
 
  }  
 
* Více viz [[Výjimky v Javě]].
 
* Více viz [[Výjimky v Javě]].
 
  
 
== Čtení ze souboru (<code>Scanner</code>) ==
 
== Čtení ze souboru (<code>Scanner</code>) ==
Řádka 21: Řádka 20:
 
* Pro čtení dat z&nbsp;textových souborů slouží v Javě třída <code>Scanner</code> z&nbsp;balíčku <code>java.util</code>.
 
* Pro čtení dat z&nbsp;textových souborů slouží v Javě třída <code>Scanner</code> z&nbsp;balíčku <code>java.util</code>.
 
* Slouží také pro čtení vstupu z&nbsp;klávesnice v&nbsp;konzolových aplikacích (aplikacích, které běží jen v&nbsp;příkazovém řádku).
 
* Slouží také pro čtení vstupu z&nbsp;klávesnice v&nbsp;konzolových aplikacích (aplikacích, které běží jen v&nbsp;příkazovém řádku).
* Zaveden od Javy 5 &mdash; nahrazuje <tt>BufferedReader</tt>.
+
* Zaveden od Javy 5 &mdash; lze použít pro převod hodnot z&nbsp;textového zápisu jako „zapouzdření“ třídy <tt>BufferedReader</tt>.
 
* Výhodou je, že umí automaticky načíst čísla (včetně desetinných) z&nbsp;jejich textové podoby.
 
* Výhodou je, že umí automaticky načíst čísla (včetně desetinných) z&nbsp;jejich textové podoby.
  
Řádka 31: Řádka 30:
  
 
; Konstruktory třídy <code>Scanner</code>:
 
; Konstruktory třídy <code>Scanner</code>:
 +
* <code>Scanner(BufferedReader otevrenyVstupniStream, String encoding)</code>
 
* <code>Scanner(File vstupniSoubor, String encoding)</code>
 
* <code>Scanner(File vstupniSoubor, String encoding)</code>
 
* <code>Scanner(Path vstupniSoubor, String encoding)</code>
 
* <code>Scanner(Path vstupniSoubor, String encoding)</code>
Řádka 96: Řádka 96:
 
  String nazev = "vstup.txt";
 
  String nazev = "vstup.txt";
 
  Scanner sc = null;
 
  Scanner sc = null;
  try {
+
  try (Scanner sc = new Scanner(new BufferedReader(new File(nazev)), "windows-1250");) {
    sc = new Scanner(new File(nazev), "windows-1250");
+
     int cislo = sc.nextInt();
     int cislo = sc.nextInt()
+
    ''// ...''
  } catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!";
+
  } catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!");
 
  } catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage());
 
  } catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage());
 
  } catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage());  
 
  } catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage());  
} finally {
 
    sc.close();
 
 
  }
 
  }
 
''...''
 
  
 
<div class="Poznamka">
 
<div class="Poznamka">
Pokud zadáte pouze název souboru, uloží se soubor do aktuální složky.  
+
Pokud zadáte pouze název souboru, hledá se soubor v&nbsp;aktuální složce. Která složka je aktuální:  
 
+
* Při spuštění z&nbsp;vývojového prostředí (Greenfoot, NetBeans,...) je to obvykle složka, ve které jsou umístěny zdrojové soubory (na stejné úrovni jako složka <tt>src</tt>).
Která složka je aktuální:  
+
* Při spuštění z&nbsp;vývojového prostředí (Greenfoot, NetBeans,...) je to obvykle složka, ve které jsou umístěny zdrojové soubory.
+
 
* Při spuštění samostatného souboru .JAR je to složka, ve které je soubor .JAR umístěn.
 
* Při spuštění samostatného souboru .JAR je to složka, ve které je soubor .JAR umístěn.
  
Můžete zadat i celou cestu, například pro Windows: <code>String nazev = "C:\\temp\\data.txt";</code>.
+
Můžete zadat i celou cestu, například pro Windows: <code>String nazev = "C:\\temp\\data.txt";</code>, ale pak výsledný program funguje jen na vašem počítači a na počítačích, které mají soubor přesně ve stejném umístění.
 
</div>
 
</div>
  
Řádka 126: Řádka 120:
 
   
 
   
 
  String nazev = "vstup.txt";
 
  String nazev = "vstup.txt";
  Scanner sc = null;
+
  try (Scanner sc = new Scanner(new BufferedReader(new File(nazev))), "windows-1250");
try {
+
    sc = new Scanner(new File(nazev), "windows-1250");
+
 
     while (sc.hasNextInt()) {
 
     while (sc.hasNextInt()) {
 
         int cislo = sc.nextInt();
 
         int cislo = sc.nextInt();
 
         System.out.println(cislo);
 
         System.out.println(cislo);
 
     }
 
     }
  } catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!";  
+
  } catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!");  
 
  } catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage());  
 
  } catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage());  
 
  } catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage());  
 
  } catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage());  
} finally {
 
    sc.close();
 
 
  }
 
  }
 
   
 
   
Řádka 205: Řádka 195:
 
  String kodovani = "windows-1250";
 
  String kodovani = "windows-1250";
 
  String nazevSouboru = "vystup.txt";
 
  String nazevSouboru = "vystup.txt";
  try {
+
  try (PrintWriter out = new PrintWriter(new File(nazevSouboru), kodovani))
    File soubor = new File(nazevSouboru);
+
    PrintWriter out = new PrintWriter(soubor, kodovani);
+
 
     out.println("Hello world!");
 
     out.println("Hello world!");
 
     out.close();
 
     out.close();

Aktuální verze z 7. 11. 2022, 10:07


Obsah

Ošetření chyb, výjimky

try (otevření souboru) { // Otevři soubor a začni tím blok, ve kterém může nastat chybový stav...
    ... zde následuje kód, pracující se souborem...
} catch (IOException ex) { 
    // Co se má stát, pokud nastane chyba při práci se souborem...
} catch (FileNotFoundException ex) { 
    // Co se má stát, když zadaný soubor vůbec neexistuje
} 

Čtení ze souboru (Scanner)

Třída Scanner

Třídu Scanner nepoužívejte v programech, které pracují s vlákny!

Otevření souboru

Konstruktory třídy Scanner

Kódování národních znaků:


Pokud nenastavíte správné kódování českých znaků, třída Scanner se při ladění v prostředí NetBeans 8.0.2 (JDK 7u71) může chovat k souboru, jako by byl prázdný.

Pokud máte podobné problémy, zkuste:

a) nastavte správné kódování češtiny v konstruktoru Scanneru či zkonvertujte soubor na správné kódování (třeba pomocí Notepadu++ či jiného editoru, který umí nastavit kódování).

b) projekt přeložte (Clean & Build) a spusťte přímo výsledný JAR ze složky dist v adresáři projektu. (viz Export balíčku JAR).

Metody třídy Scanner

Získání dalšího bloku dat ze souboru
Zjištění — je v souboru další blok dat?
Další nastavení
out.useDelimiter("\\s*[;,\n\r\t]\\s*")
Ukončení práce se souborem

Příklad: Načtení jednoho čísla ze souboru

import java.util.Scanner;
import java.io.File;

...

String nazev = "vstup.txt";
Scanner sc = null;
try (Scanner sc = new Scanner(new BufferedReader(new File(nazev)), "windows-1250");) {
    int cislo = sc.nextInt();
    // ...
} catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!");
} catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage());
} catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage()); 
}

Pokud zadáte pouze název souboru, hledá se soubor v aktuální složce. Která složka je aktuální:

  • Při spuštění z vývojového prostředí (Greenfoot, NetBeans,...) je to obvykle složka, ve které jsou umístěny zdrojové soubory (na stejné úrovni jako složka src).
  • Při spuštění samostatného souboru .JAR je to složka, ve které je soubor .JAR umístěn.

Můžete zadat i celou cestu, například pro Windows: String nazev = "C:\\temp\\data.txt";, ale pak výsledný program funguje jen na vašem počítači a na počítačích, které mají soubor přesně ve stejném umístění.


Příklad: Načtení všech čísel ze souboru

import java.util.Scanner;
import java.io.File;

...

String nazev = "vstup.txt";
try (Scanner sc = new Scanner(new BufferedReader(new File(nazev))), "windows-1250");
    while (sc.hasNextInt()) {
        int cislo = sc.nextInt();
        System.out.println(cislo);
    }
} catch (FileNotFoundException ex) { System.err.println("Nenalezen soubor: "+nazev+"!"); 
} catch (IOException ex) { System.err.println("Chyba čtení ze souboru "+nazev+": "+ex.getLocalizedMessage()); 
} catch (InputMismatchException ex) { System.err.println("Nesprávný formát dat v souboru "+nazev+": "+ex.getLocalizedMessage()); 
}

...


Příklad: Načtení všech řádků textu ze souboru

Scanner sc = new Scanner(new File("myRows"), "windows-1250");
while (sc.hasNextLine()) {
    ...
    String radek = sc.nextLine();
    ...
}
sc.close();

Příklad: Načtení jednoho čísla z klávesnice

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
String text = input.next();
sc.close();



Zápis do souboru (PrintWriter)

Třída PrintWriter slouží pro zápis dat do textového výstupu.

Využívá efektivnější zápis pomocí vyrovnávací paměti (bufferu)
Otevření souboru
String kodovani = "windows-1250";
String nazev = "vystup.txt";
PrintWriter out = new PrintWriter(new File(nazev), kodovani);

Pokud zadáte pouze název souboru, hledá se soubor v aktuální složce.

Která složka je aktuální:

  • Při spuštění z vývojového prostředí (Greenfoot, NetBeans,...) je to obvykle složka, ve které jsou umístěny zdrojové soubory.
  • Při spuštění samostatného souboru .JAR je to složka, ve které je soubor .JAR umístěn.

Můžete zadat i celou cestu, například pro Windows: String nazev = "C:\\temp\\data.txt";.

Metody

Příklad — Zápis věty do souboru

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
...
String kodovani = "windows-1250";
String nazevSouboru = "vystup.txt";
try (PrintWriter out = new PrintWriter(new File(nazevSouboru), kodovani))
    out.println("Hello world!");
    out.close();
} catch (FileNotFoundException ex) { System.err.println("Soubor "+nazevSouboru+" nenalezen: "+ex.getLocalizedMessage());
} catch (UnsupportedEncodingException ex) { System.err.println("Neznámé kódování "+kodovani+": "+ex.getLocalizedMessage());
}


Můžete použít i novější knihovnu java.nio a třídu BufferedWriter

Museli byste si ale sami vyřešit textový zápis celých a desetinných čísel:

Charset kodovani = Charset.forName("windows-1250");
Path cesta = Paths.get("vystup.txt");
BufferedWriter out = Files.newBufferedWriter(cesta, kodovani);

Související třídy:

  • Charset
    • informace o kódování souboru
  • Files, Paths
    • práce s cestami a soubory.

Standardní vstup a výstup

System.out
System.out.print("Ahoj!");
System.out.println("Vypíše řádek na obrazovku!");
System.in
System.in.read();
System.in.available() > 0
System.err
System.err.println("Nastala chyba zápisu do souboru!");

Související stránky


Zdroje

  1. JavaPractices.com → Reading and writing text files
  2. Java Tutorial → Scanner
Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje