Erinevus lehekülje "Java:Sisend-Väljund" redaktsioonide vahel

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti
(Uus lehekülg: 'Sisend-väljund')
 
 
(ei näidata sama kasutaja 2 vahepealset redaktsiooni)
1. rida: 1. rida:
 +
 +
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 ''wrapper''it nagu <code>BufferedReader</code>. Kui voog otse võimaldab lugeda andmeid bait-haaval, siis <code>BufferedReader</code> 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 <code>br</code>, 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>
 +
 +
<code>Scanner</code> on selline vahend, mida saab kasutada väga edukalt ilma <code>try-catch</code> osata. Samuti võimaldab <code>Scanner</code> sisendist eraldada näiteks numbrid ja teksti. <code>BufferedReader</code> 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>
 +
 
[[Category:Java juhend|Sisend-väljund]]
 
[[Category:Java juhend|Sisend-väljund]]

Viimane redaktsioon: 18. veebruar 2015, kell 02:02

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>