1. Membaca daripada konsol menggunakanSystem.in

Dalam pelajaran sebelumnya, kami membiasakan diri dengan arahan untuk memaparkan maklumat pada skrin. Untuk melakukan ini, kami telah menggunakan System.outobjek print()dan println()kaedahnya. Ia mudah dan mudah.

Tetapi, seperti yang anda mungkin sudah meneka, memaparkan maklumat pada skrin tidak mencukupi untuk kami. Tujuan kebanyakan program adalah untuk melakukan sesuatu yang berguna untuk pengguna. Ini bermakna bahawa ia sangat kerap diperlukan untuk pengguna boleh memasukkan data dari papan kekunci.

Sama seperti kes untuk output, kami juga mempunyai objek khas untuk input data — System.in. Tetapi, malangnya bagi kami, ia tidak semudah yang kami mahu. Ia membolehkan kami membaca data dari papan kekunci satu aksara pada satu masa.

Untuk menambah baik ini, kami akan menggunakan kelas lain yang, apabila dipasangkan dengan System.inobjek, akan memberikan kami semua yang kami perlukan. Untuk masa yang lama sekarang, Java mempunyai kelas yang sesuai untuk setiap kesempatan. Dan kita akan mengenali salah seorang daripada mereka sekarang.


2. Scannerkelas

Kelas Scanner(nama penuh: java.util.Scanner) boleh membaca data daripada sumber yang berbeza, contohnya konsol, fail dan Internet. Jika kita mahu ia membaca data dari papan kekunci, maka kita mesti memasukkan objek System.insebagai hujah yang akan berfungsi sebagai sumber data. Dan kemudian objek Pengimbas akan memikirkan apa yang perlu dilakukan dengannya.

Membaca dari papan kekunci menggunakan Scannerobjek akan kelihatan seperti ini:

Kod Penjelasan
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Kami mencipta Scannerobjek.
Kami membaca sebaris teks dari papan kekunci.
Kami membaca nombor dari papan kekunci.

Ia kelihatan mudah, tetapi adakah ia benar-benar semudah itu?

Saya fikir anda mesti mempunyai banyak soalan, dan sekarang kami akan menjawabnya.

Tetapi pertama, mari kita tunjukkan contoh program lengkap yang menggunakan Scannerkelas:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. Mencipta Scannerobjek

Soalan pertama ialah apakah baris ini Scanner console = new Scanner (System.in);?

Baris ini mungkin mengelirukan, tetapi anda akan melihat perkara yang serupa sepanjang masa. Jadi kami fikir adalah penting untuk menerangkan perkara yang berlaku di sini.

Ingat bagaimana kita biasanya membuat pembolehubah dengan teks:

String str = "text";
Mengisytiharkan dan memulakan pembolehubah rentetan

Mula-mula, kita tulis jenis pembolehubah ( String), kemudian namanya ( str), dan akhirnya, selepas tanda sama, kita tulis nilainya.

Barisan kami yang membingungkan sebenarnya sama:

Scanner console = new Scanner(System.in);
Mengisytiharkan dan memulakan Scannerpembolehubah

Segala-galanya di sebelah kiri tanda sama ialah pengisytiharan pembolehubah bernama consoleyang jenisnya ialah Scanner. Sebaliknya anda boleh memanggilnya s atau scannermalah keyboard. Kemudian kod itu akan kelihatan seperti ini:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

Saya fikir itu menjadikan segala-galanya lebih jelas.

Tetapi kod di sebelah kanan tanda sama adalah sedikit lebih rumit. Saya kini merujuk kepada new Scanner(System.in); Yang berkata, tiada apa-apa perkara ghaib berlaku di sini sama ada.

Dalam kod ini, kami memberitahu mesin Java: buat objek baharu (kata newkunci) yang jenisnya ialah Scanner , menghantar objek System.insebagai sumber data untuk Scannerobjek yang baru dibuat.

Selepas melaksanakan keseluruhan baris ini, kami akan mempunyai Scannerpembolehubah bernama console yang program kami akan gunakan untuk membaca data dari papan kekunci.


4. Senarai kaedah

Dalam contoh di atas, Scanner consolepembolehubah kami menyimpan rujukan kepada Scannerobjek.

Untuk memanggil kaedah pada objek yang dirujuk oleh pembolehubah, anda menulis noktah selepas nama pembolehubah, diikuti dengan nama kaedah dan sebarang argumen. Penampilan umum arahan adalah seperti berikut:

variable.method(arguments);
Memanggil kaedah pada objek yang dirujuk oleh pembolehubah

Contoh:

System.out.println("Hello");
System.out.println(1);

Jika anda tidak bercadang untuk menghantar hujah kepada fungsi, maka anda hanya menulis kurungan kosong:

variable.method();
Memanggil kaedah tanpa memberikan hujah

Contoh:

System.out.println();

5. Input konsol

Apabila kita mempunyai Scannerobjek, mudah untuk mendapatkan data dari papan kekunci.

Untuk membaca baris dari papan kekunci , anda memerlukan arahan ini:

String str = console.nextLine();

Apabila pelaksanaan program mencapai baris ini, ia akan berhenti seketika dan menunggu pengguna memasukkan data dan tekan enter. Kemudian semua yang dimasukkan pengguna disimpan dalam pembolehubah str.

Untuk membaca nombor dari papan kekunci , anda memerlukan arahan ini:

int number = console.nextInt();

Semuanya di sini adalah seperti arahan sebelumnya. Apabila pelaksanaan program mencapai baris ini, ia akan berhenti seketika dan menunggu pengguna memasukkan data dan tekan enter. Selepas itu, semua yang dimasukkan pengguna ditukar kepada nombor dan disimpan dalam pembolehubah number.

Jika pengguna memasukkan data yang tidak boleh ditukar kepada integer, program akan menjana ralat dan keluar.

Untuk membaca nombor pecahan dari papan kekunci , anda memerlukan arahan ini:

double number = console.nextDouble();

Pernyataan ini hampir sama dengan yang mempunyai nextInt()kaedah, hanya ia menyemak bahawa data yang dimasukkan boleh ditukar kepada nombor double.

Contoh program yang membaca dua nombor dari papan kekunci dan memaparkan jumlahnya pada skrin:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
Catatan

Pengguna boleh memasukkan beberapa nombor pada satu baris, memisahkannya dengan ruang: kaedah kelas Scannertahu cara mengendalikannya. Yang berkata, program membaca nombor hanya selepas pengguna menekan Enter.



6. Kaedah lain Scannerkelas

By the way, kaedah di atas bukanlah semua yang Scannerditawarkan oleh kelas. Senarai lengkap kaedah kelihatan seperti ini:

Kaedah Penerangan
nextByte()
Membaca data dan menukarkannya kepada abyte
nextShort()
Membaca data dan menukarkannya kepada ashort
nextInt()
Membaca data dan menukarnya kepada anint
nextLong()
Membaca data dan menukarkannya kepada along
nextFloat()
Membaca data dan menukarkannya kepada afloat
nextDouble()
Membaca data dan menukarkannya kepada adouble
nextBoolean()
Membaca data dan menukarkannya kepada aboolean
next()
Membaca satu "token". Token dipisahkan dengan ruang atau tekan kekunci enter
nextLine()
Membaca seluruh baris

Terdapat juga kaedah yang membolehkan anda menyemak token seterusnya dalam input tanpa benar-benar mengambilnya (untuk mengetahui kaedah yang hendak digunakan untuk membacanya).

Kaedah Penerangan
hasNextByte()
byteAdakah terdapat Bolehkah input ditukar kepada byte?
hasNextShort()
shortAdakah terdapat Bolehkah input ditukar kepada short?
hasNextInt()
intAdakah terdapat Bolehkah input ditukar kepada int?
hasNextLong()
longAdakah terdapat Bolehkah input ditukar kepada long?
hasNextFloat()
floatAdakah terdapat Bolehkah input ditukar kepada float?
hasNextDouble()
doubleAdakah terdapat Bolehkah input ditukar kepada double?
hasNextBoolean()
booleanAdakah terdapat Bolehkah input ditukar kepada boolean?
hasNext()
Adakah terdapat token lain?
hasNextLine()
Adakah terdapat baris lain?

7. Membaca data daripada rentetan

Kami sebelum ini menyebut bahawa Scannerkelas boleh membaca data daripada pelbagai sumber. Salah satu sumber tersebut ialah rentetan teks .

Ia kelihatan seperti ini:

String str = "text";
Scanner scanner = new Scanner(str);

Apabila mencipta Scannerobjek, kami memasukkan rentetan strdan bukannya System.inobjek. Dan kini scannerobjek akan membaca data daripada rentetan. Contoh:

Kod program: Penjelasan:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}


// a == 10; 
// b == 20; 
Output skrin akan menjadi:30