Java: Textový vstup a výstup
(Doplněna informace, že problém se Scannerem lze obejít uložením v UTF-8.) |
(→Vstup (Scanner): Upřesněno vysvětlení k nastavení kódování, doplněno info, jak nastavit kódování.) |
||
Řádka 47: | Řádka 47: | ||
* 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>. | ||
+ | |||
+ | <div class="Varovani">Třídu Scanner nepoužívejte v programech, které pracují s [[Vlákna v Javě|vlákny]]!</div> | ||
+ | |||
+ | ; Konstruktory: | ||
+ | * <code>Scanner(File vstupniSoubor, String encoding)</code> | ||
+ | * <code>Scanner(Path vstupniSoubor, String encoding)</code> | ||
+ | * ... | ||
+ | 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: | ||
+ | *# <code>windows-1250</code>... programy ve Windows (Poznámkový blok, Excel,...), | ||
+ | *# <code>cp852</code>... skripty pro příkazový řádek, | ||
+ | *# <code>uft-8</code>... programátorské nástroje, programy v Linuxu. | ||
+ | |||
<div class="Poznamka"> | <div class="Poznamka"> | ||
− | + | 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: | Pokud máte podobné problémy, zkuste: | ||
− | a) | + | 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 | + | b) projekt přeložte (''Clean & Build'') a spusťte přímo výsledný JAR ze složky <code>dist</code> v adresáři projektu. ([[Java:_Export_bal%C3%AD%C4%8Dku_JAR#Export_z_NetBeans|viz Export balíčku JAR]]). |
</div> | </div> | ||
− | |||
; Metody: | ; Metody: | ||
Řádka 88: | Řádka 101: | ||
... | ... | ||
long aLong = sc.nextLong(); | long aLong = sc.nextLong(); | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | Scanner sc = new Scanner(new File("myRows"), "windows-1250"); | ||
+ | while (sc.hasNextLine()) { | ||
+ | ... | ||
+ | String radek = sc.nextLine(); | ||
... | ... | ||
} | } |
Verze z 30. 4. 2018, 07:53
Obsah |
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();
Vstup (Scanner)
- Třída
Scanner
slouží 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(); ... }
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
Viz také