Java: Textový vstup a výstup

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Rozšířeno, další příklady,...)
(Použit PrintWriter místo BufferedWriteru - jednodušší výstup do textových souborů.)
Řádka 140: Řádka 140:
  
  
== Zápis do souboru (<tt>BufferedWriter</tt>) ==
+
== Zápis do souboru (<tt>PrintWriter</tt>) ==
  
Třída <code>BufferedWriter</code> slouží pro zápis dat do textového výstupu.
+
Třída <code>PrintWriter</code> slouží pro zápis dat do textového výstupu.
  
; Princip:
+
; Využívá efektivnější zápis pomocí vyrovnávací paměti (bufferu):
 
*Ukládá zapisovaná data do paměťového bufferu.
 
*Ukládá zapisovaná data do paměťového bufferu.
 
*Teprve při dosažení limitu data naráz zapíše.
 
*Teprve při dosažení limitu data naráz zapíše.
 
*Je to efektivnější, než psát jednotlivé malé texty hned!
 
*Je to efektivnější, než psát jednotlivé malé texty hned!
 
; Otevření standardního výstupu
 
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
 
Tuto variantu používáme tehdy, kdy chceme společnou metodu pro psaní do souboru i na standardní výstup.
 
Pro standardní výstup jinak samozřejmě stačí:
 
System.out.println(...);
 
  
 
; Otevření souboru
 
; Otevření souboru
  Charset kodovani = Charset.forName("utf-8");
+
  String kodovani = "windows-1250";
  Path cesta = Paths.get("vystup.txt");
+
  File soubor = new File("vystup.txt");
  BufferedWriter out = Files.newBufferedWriter(cesta, kodovani);
+
  PrintWriter out = new PrintWriter(soubor, kodovani);
Související třídy:
+
* <tt>Charset</tt>
+
** informace o kódování souboru
+
* <tt>Files</tt>, <tt>Paths</tt>
+
** práce s cestami a soubory
+
** umí i otevřít <tt>BufferedWriter</tt>.
+
  
 
; Metody
 
; Metody
* <code>write(String text)</code>
+
* <code>println(String text)</code>
* <code>newLine()</code>
+
** Přidá řádek do výstupního souboru.
** Přidá do výstupu konec řádku. Respektuje národní nastavení a platformové závislosti.
+
 
* <code>flush()</code>
 
* <code>flush()</code>
 
** Provede fyzický zápis stávajícího obsahu bufferu na výstup.
 
** Provede fyzický zápis stávajícího obsahu bufferu na výstup.
Řádka 176: Řádka 163:
 
** Provede i <code>flush()</code>.
 
** Provede i <code>flush()</code>.
  
  Charset kodovani = Charset.forName("utf-8");
+
=== Příklad &mdash; Zápis věty do souboru ===
 +
String kodovani = "windows-1250";
 +
File soubor = new File("vystup.txt");
 +
PrintWriter out = new PrintWriter(soubor, kodovani);
 +
out.println("Hello world;");
 +
out.close();
 +
 
 +
 
 +
<div class="Poznamka">
 +
; Můžete použít i&nbsp;novější knihovnu <code>java.nio</code> a&nbsp;třídu <code>BufferedWriter</code>
 +
Museli byste si ale sami vyřešit textový zápis celých a&nbsp;desetinných čísel:
 +
  Charset kodovani = Charset.forName("windows-1250");
 
  Path cesta = Paths.get("vystup.txt");
 
  Path cesta = Paths.get("vystup.txt");
 
  BufferedWriter out = Files.newBufferedWriter(cesta, kodovani);
 
  BufferedWriter out = Files.newBufferedWriter(cesta, kodovani);
out.write("blabla");
+
Související třídy:
out.newLine();
+
* <tt>Charset</tt>
out.close();
+
** informace o kódování souboru
 
+
* <tt>Files</tt>, <tt>Paths</tt>
 +
** práce s cestami a soubory.
 +
</div>
  
  
Řádka 202: Řádka 202:
 
  System.in.available() > 0
 
  System.in.available() > 0
  
 +
; System.err
 +
* Chybový výstup. Na obrazovce se vypíše stejně jako u&nbsp;<code>System.out</code>, ale můžeme ho přesměrovat (viz práce se vstupy a&nbsp;výstupy ve 3.&nbsp;ročínku (Operační systémy):
 +
System.err.println("Nastala chyba zápisu do souboru!");
  
 
== Související stránky ==
 
== Související stránky ==

Verze z 23. 3. 2020, 22:40


Obsah

Ošetření chyb, výjimky

try { // Začni provádět kód, 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;

...

try {
    String nazev = "vstup.txt";
    Scanner sc = new Scanner(new File(nazev), "windows-1250");
    int cislo = sc.nextInt()
    sc.close();
} 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 čísel ze souboru

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

...

try {
    String nazev = "vstup.txt";
    Scanner sc = new Scanner(new File(nazev), "windows-1250");
    while (sc.hasNextInt()) {
        int cislo = sc.nextInt();
        System.out.println(cislo);
    }
    sc.close();
} 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();
vstup=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";
File soubor = new File("vystup.txt");
PrintWriter out = new PrintWriter(soubor, kodovani);
Metody

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

String kodovani = "windows-1250";
File soubor = new File("vystup.txt");
PrintWriter out = new PrintWriter(soubor, kodovani);
out.println("Hello world;");
out.close();


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