Java:Sisend-Väljund

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Programmi suhtlemist välismaailmaga toimub läbi sisendi ja väljundi. Lühendatult viidatakse tihti "I/O", mis tähendab input/output.

Seade võib olla ühenduses mitme sisend- ja väljundseadmega.

Masinloetav ja inimloetav voog

Andmed võib jagada kahte kategooriasse: masinloetavad andmed ja inimloetavad andmed. Masinloetavad andmed on esitatud bittidena (ühtede ja nullide jadadena). Inimloetavad andmed koosnevad loetavatest sümbolitest, üldiselt 10nd-süsteemis. Näiteks 3.141592654.

Javas on kaks erinevat voogu:

  • baitvoog (ingl byte stream) masinloetavate andmete jaoks
  • sümbolvoog (ingl character stream) inimloetavate andmete jaoks.

Inimloetavate andmete lugemine

Kui teil on vaja lugeda andmeid mõnest voost (näiteks standardsisendist), saab kasutada sellist wrapperit nagu BufferedReader. Kui voog otse võimaldab lugeda andmeid bait-haaval, siis BufferedReader võimaldab andmeid lugeda reakaupa (oluliselt mugavam).

Näiteks: <source lang="java" line> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

public class BufferedReaderExample {

public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("write something:"); String line = br.readLine(); System.out.println("got line:" + line); } catch (IOException e) { e.printStackTrace(); } }

}

</source>

Read 1-3 impordivad vajalikud klassikirjeldused. Need täidab Eclipse'i automaatselt ära. Kui kasutate mõnda muud arenduskeskkonda (kasvõi näiteks vim), siis peate need import-laused ise kirjutama.

Real 8 luuakse uus objekt muutujasse br, mida kasutame lugemiseks.

Rida 11 on see, mille jaoks meil on vaja erindi haldusega tegeleda.

Üks teine näide, kus kasutame natuke teistsugust wrapperit:

<source lang="java"> import java.util.Scanner;

public class ScannerExample {

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("write something:"); if (scanner.hasNext()) { String line = scanner.nextLine(); System.out.println("got:" + line); }

}

}

</source>

Scanner on selline vahend, mida saab kasutada väga edukalt ilma try-catch osata. Samuti võimaldab Scanner sisendist eraldada näiteks numbrid ja teksti. BufferedReader puhul saab sisendit lugeda ridahaaval - ülejäänud töötlus tuleb ise teha.

Allpool on kaks näidet, kuidas küsida kasutajalt vanust ja see täisarvuna kätte saada.

BufferedReader näide: <source lang="java"> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

public class InputAge {

public static void main(String[] args) {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("age:"); String line = br.readLine(); int age = Integer.parseInt(line); System.out.println("got age:" + age); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { System.out.println("Only numbers allowed!"); } }

}

</source>

Scanner näide: <source lang="java"> import java.util.Scanner;

public class InputAge {

public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("age:"); if (scanner.hasNextInt()) { int age = scanner.nextInt(); System.out.println("got age:" + age); } else { System.out.println("Only numbers allowed!"); }

}

}

</source>

Tavaliselt on programm vaja üles ehitada nii, et vanuse küsimuse puhul korratakse küsimust seni, kuni saadakse korrektne sisend. Siin näide BufferedReader'iga selle saaavutamine. Scanner'iga sama asja realiseerimise jädan teile harjutamiseks.

<source lang="java"> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

public class ReadInputLoop {

public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { // endless loop, should work forever try { System.out.println("age:"); String line = br.readLine(); int age = Integer.parseInt(line); System.out.println("got age:" + age); // let's have a regular if-check also here if (age < 0 || age > 100) { System.out.println("Not in correct range!"); } // if an exception occurs, the "break" // line is never reached and therefore // the user is asked again his/her age. break; // breaks out of the loop

} catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { System.out.println("Only numbers allowed!"); } } }

}

</source>