Java: Textový vstup a výstup
|  (→Vstup (Scanner):  Upřesněno vysvětlení k nastavení kódování, doplněno info, jak nastavit kódování.) | m (Upraveno pořadí kapitol a názvy.) | ||
| Řádka 1: | Řádka 1: | ||
| [[Category:VSE]][[Category:Informatika]][[Category:Java]] | [[Category:VSE]][[Category:Informatika]][[Category:Java]] | ||
| − | ==  | + | == Čtení ze souboru (<tt>Scanner</tt>) == | 
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| * Třída <code>Scanner</code> slouží ke čtení z textového vstupu — z klávesnice nebo z textového souboru. | * Třída <code>Scanner</code> slouží ke čtení z textového vstupu — z klávesnice nebo z textového souboru. | ||
| * Zaveden od Javy 5 — nahrazuje <tt>BufferedReader</tt>. | * Zaveden od Javy 5 — nahrazuje <tt>BufferedReader</tt>. | ||
| Řádka 110: | Řádka 67: | ||
|       ... |       ... | ||
|   } |   } | ||
| + | |||
| + | |||
| + | == Zápis do souboru (<tt>BufferedWriter</tt>) == | ||
| + | |||
| + | Třída <code>BufferedWriter</code> slouží pro zápis dat do textového výstupu. | ||
| + | |||
| + | ; Princip: | ||
| + | *Ukládá zapisovaná data do paměťového bufferu. | ||
| + | *Teprve při dosažení limitu data naráz zapíše. | ||
| + | *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 | ||
| + |  Charset kodovani = Charset.forName("utf-8"); | ||
| + |  Path cesta = Paths.get("vystup.txt"); | ||
| + |  BufferedWriter out = Files.newBufferedWriter(cesta, 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 | ||
| + | * <code>write(String text)</code> | ||
| + | * <code>newLine()</code> | ||
| + | ** Přidá do výstupu konec řádku. Respektuje národní nastavení a platformové závislosti. | ||
| + | * <code>flush()</code> | ||
| + | ** Provede fyzický zápis stávajícího obsahu bufferu na výstup. | ||
| + | * <code>close()</code> | ||
| + | ** Zavře výstupní soubor. | ||
| + | ** Provede i <code>flush()</code>. | ||
| + | |||
| + |  Charset kodovani = Charset.forName("utf-8"); | ||
| + |  Path cesta = Paths.get("vystup.txt"); | ||
| + |  BufferedWriter out = Files.newBufferedWriter(cesta, kodovani); | ||
| + |  out.write("blabla"); | ||
| + |  out.newLine(); | ||
| + |  out.close(); | ||
| + | |||
| == Standardní vstup a výstup == | == Standardní vstup a výstup == | ||
| Řádka 127: | Řádka 129: | ||
|   System.in.available() > 0 |   System.in.available() > 0 | ||
| − | ==  | + | |
| + | == Související stránky == | ||
| * [[Práce se soubory v Javě]] | * [[Práce se soubory v Javě]] | ||
| + | |||
Verze z 16. 3. 2020, 15:49
| Obsah | 
Čtení ze souboru (Scanner)
-  Třída Scannerslouží ke čtení z textového vstupu — z klávesnice nebo z textového souboru.
- Zaveden od Javy 5 — nahrazuje BufferedReader.
- Konstruktory
-  Scanner(File vstupniSoubor, String encoding)
-  Scanner(Path vstupniSoubor, String encoding)
- ...
Kódování národních znaků:
- U všech konstruktorů můžeme druhý parametr vynechat, pak se použije kódování UTF-8.
-  Označení běžných kódování, používaných pro češtinu: 
-  windows-1250... programy ve Windows (Poznámkový blok, Excel,...),
-  cp852... skripty pro příkazový řádek,
-  uft-8... programátorské nástroje, programy v Linuxu.
 
-  
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
-  next()- přečte celý řádek až po oddělovač (viz dále)
- při čtení z konzole (klávesnice) čeká na oddělovač
- bere jednotlivá slova, oddělená standardně bílým místem
 
-  int nextInt()
-  int nextDouble()- vrací objektový typ Double.
- Desetinná čísla je třeba zadávat podle národního nastavení. Pro české nastavení tedy s desetinnou čárkou.
 
-  boolean hasNext()- je k dispozici další slovo?
 
-  boolean hasNextDouble()- následuje na vstupu desetinné číslo?
 
-  useDelimiter(String delim), resp.useDelimiter(Pattern delim)-  Oddělovač položek na řádku, například:out.useDelimiter(",");
-  Jako oddělovač lze použít i regulární výraz (→ Wikipedia.org) reprezentovaný třídou Pattern.
- Pro načítání jednoduchého CSV lze použít (pozor, není to plnohodnotné čtení CSV, ale mnohdy stačí):
 
-  Oddělovač položek na řádku, například:
out.useDelimiter("\\s*[;,\n\r\t]\\s*")
- Otevření vstupu
- Standardní vstup
Scanner sc = new Scanner(System.in); int i = sc.nextInt(); vstup=input.next();
- Ze souboru:
Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
    ...
    long aLong = sc.nextLong();
    ...
}
Scanner sc = new Scanner(new File("myRows"), "windows-1250");
while (sc.hasNextLine()) {
    ...
    String radek = sc.nextLine();
    ...
}
Zápis do souboru (BufferedWriter)
Třída BufferedWriter slouží pro zápis dat do textového výstupu.
- Princip
- Ukládá zapisovaná data do paměťového bufferu.
- Teprve při dosažení limitu data naráz zapíše.
- 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
Charset kodovani = Charset.forName("utf-8");
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
- umí i otevřít BufferedWriter.
 
- Metody
-  write(String text)
-  newLine()- Přidá do výstupu konec řádku. Respektuje národní nastavení a platformové závislosti.
 
-  flush()- Provede fyzický zápis stávajícího obsahu bufferu na výstup.
 
-  close()- Zavře výstupní soubor.
-  Provede i flush().
 
Charset kodovani = Charset.forName("utf-8");
Path cesta = Paths.get("vystup.txt");
BufferedWriter out = Files.newBufferedWriter(cesta, kodovani);
out.write("blabla");
out.newLine();
out.close();
Standardní vstup a výstup
- Unixové programy a programy pro textový řádek často potřebují číst data ze standardního vstupu (běžně klávesnice) a zapisovat data na standardní výstup (běžně monitor).
- Pro základní práci mnohdy stačí přímo pracovat se standardním vstupem a výstupem přímo:
- System.out
- Běžně používáme pro výstup do konzole:
System.out.print("Ahoj!");
System.out.println("Vypíše řádek na obrazovku!");
- System.in
- Vyžaduje práci s vyjímkami (může vyhodit IOException), je tedy lepší použít třídu Scanner, pokud to lze.
- Čekání na stisk Enteru:
System.in.read();
- Test stisku libovolné klávesy:
System.in.available() > 0
Související stránky
