Java:Sisend-Väljund
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>