Java: Textový vstup a výstup

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(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 &mdash; z klávesnice nebo z textového souboru.
 
* Třída <code>Scanner</code> slouží ke čtení z textového vstupu &mdash; z klávesnice nebo z textového souboru.
 
* Zaveden od Javy 5 &mdash; nahrazuje <tt>BufferedReader</tt>.
 
* Zaveden od Javy 5 &mdash; nahrazuje <tt>BufferedReader</tt>.
 +
 +
<div class="Varovani">Třídu Scanner nepoužívejte v&nbsp;programech, které pracují s&nbsp;[[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">
Narazili jsme na problém, že třída Scanner se při ladění v prostředí NetBeans 8.0.2 (JDK 7u71) chovala se k souboru, jako by byl prázdný.  
+
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) uložte vstupní soubor v kódování UTF-8 (třeba pomocí Notepadu++ či jiného editoru, který umí nastavit kódování). S&nbsp;kódováním ANSI má debugger v Netbeans, zdá se, problém.
+
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žit (''Clean & Build'') a spustit 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]]).
+
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>
<div class="Varovani">Třídu Scanner nepoužívejte v&nbsp;programech, které pracují s&nbsp;[[Vlákna v Javě|vlákny]]!</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
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:

Metody
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řídu Scanner nepoužívejte v programech, které pracují s vlákny!
Konstruktory

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
out.useDelimiter("\\s*[;,\n\r\t]\\s*")
Otevření vstupu
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
vstup=input.next();
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

System.out
System.out.print("Ahoj!");
System.out.println("Vypíše řádek na obrazovku!");
System.in
System.in.read();
System.in.available() > 0

Viz také


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