Java: Textový vstup a výstup

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Přidáno ošetření chyb.)
(Rozšířeno, další příklady,...)
Řádka 18: Řádka 18:
 
== Čtení ze souboru (<code>Scanner</code>) ==
 
== Čtení ze souboru (<code>Scanner</code>) ==
  
=== Třída <code>Scanner</code> ==
+
=== Třída <code>Scanner</code> ===
* Pro čtení dat z&nbsp;textových souborů slouží v Javě třída <code>Scanner</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; nahrazuje <tt>BufferedReader</tt>.
Řádka 53: Řádka 53:
  
 
=== Metody třídy <code>Scanner</code> ===
 
=== Metody třídy <code>Scanner</code> ===
 +
 +
; Získání dalšího bloku dat ze souboru
 
* <code>next()</code>
 
* <code>next()</code>
 
** přečte celý řádek až po oddělovač (viz dále)
 
** přečte celý řádek až po oddělovač (viz dále)
Řádka 61: Řádka 63:
 
** vrací objektový typ <tt>Double</tt>.
 
** vrací objektový typ <tt>Double</tt>.
 
** Desetinná čísla je třeba zadávat podle národního nastavení. Pro české nastavení tedy s desetinnou čárkou.
 
** Desetinná čísla je třeba zadávat podle národního nastavení. Pro české nastavení tedy s desetinnou čárkou.
 +
 +
; Zjištění &mdash; je v&nbsp;souboru další blok dat?
 
* <code>boolean hasNext()</code>
 
* <code>boolean hasNext()</code>
 
** je k dispozici další slovo?
 
** je k dispozici další slovo?
 
* <code>boolean hasNextDouble()</code>
 
* <code>boolean hasNextDouble()</code>
 
** následuje na vstupu desetinné číslo?
 
** následuje na vstupu desetinné číslo?
 +
 +
; Další nastavení
 
* <code>useDelimiter(String delim)</code>, resp. <code>useDelimiter(Pattern delim)</code>
 
* <code>useDelimiter(String delim)</code>, resp. <code>useDelimiter(Pattern delim)</code>
 
** Oddělovač položek na řádku, například:<br /><code>out.useDelimiter(",");</code>
 
** Oddělovač položek na řádku, například:<br /><code>out.useDelimiter(",");</code>
Řádka 71: Řádka 77:
 
  out.useDelimiter("\\s*[;,\n\r\t]\\s*")
 
  out.useDelimiter("\\s*[;,\n\r\t]\\s*")
  
=== Příklad: Načtení čísel ze souboru ===  
+
; Ukončení práce se souborem
  Scanner sc = new Scanner(new File("myNumbers"));
+
* <code>close()</code>
  while (sc.hasNextLong()) {
+
** Ukončení práce se souborem &ndash; uzavření souboru.
    ...
+
** Vždy bychom měli zavolat po dokončení čtení.
     long aLong = sc.nextLong();
+
 
     ...
+
=== Příklad: Načtení jednoho čísla ze souboru ===  
  }
+
  import java.util.Scanner;
  sc.close();
+
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()); }
 +
 +
''...''
  
  
Řádka 90: Řádka 130:
 
  sc.close();
 
  sc.close();
  
== Příklad: Načtení jednoho čísla z&nbsp;klávesnice ===
+
=== Příklad: Načtení jednoho čísla z&nbsp;klávesnice ===
 
* Použijte pouze v&nbsp;aplikacích pro příkazový řádek (ne v Greenfootu nebo aplikacích s&nbsp;grafickým uživatelským prostředím).
 
* Použijte pouze v&nbsp;aplikacích pro příkazový řádek (ne v Greenfootu nebo aplikacích s&nbsp;grafickým uživatelským prostředím).
 
  Scanner sc = new Scanner(System.in);
 
  Scanner sc = new Scanner(System.in);

Verze z 17. 3. 2020, 16:07


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 (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();



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


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