Pemindai Java untuk membaca data

By | November 16, 2022

Mangihin.com.

Selamat Membaca, semoga informasi ini bermanfaat dan dapat membantu anda.

Diperbarui 2022

Kelas Pemindai tersedia dimulai dengan Java 5 dan memudahkan untuk membaca data ke dalam program Java.

Pertama kita akan melihat beberapa Contoh membaca data di Java dengan Scanner dan kemudian kami akan menjelaskan secara rinci cara kerjanya.

Untuk menggunakan Pemindai dalam program ini, kita harus melakukan hal berikut:

1. Tulis impor

Kelas Scanner ada di paket java.util sehingga harus disertakan di awal program instruksinya:

import java.util.Scanner;

dua. Buat objek Pemindai

Kita harus membuat objek kelas Pemindai yang terkait dengan perangkat input.

Jika perangkat inputnya adalah keyboard, kami akan menulis:

Scanner sc = new Scanner(System.in);

objek telah dibuat sc
terkait dengan keyboard yang diwakili oleh Sistem.dalam

Setelah ini selesai, kita dapat membaca data dengan keyboard.

3. Gunakan Pemindai

Untuk membaca data dari keyboard dengan Scanner kita dapat menggunakan metode nextXxx() di mana Xxx menunjukkan jenis data yang akan dibaca:

  • nextByte() untuk membaca data bertipe byte.
  • nextShort() untuk membaca tipe data pendek.
  • nextInt() untuk membaca data bertipe int.
  • nextLong() untuk membaca data bertipe long.
  • float berikutnya() untuk membaca data bertipe float.
  • nextDouble() untuk membaca data bertipe double.
  • nextBoolean() untuk membaca tipe data boolean.
  • baris berikutnya() untuk membaca String sampai baris baru ditemukan.
  • Berikutnya() untuk membaca String hingga pembatas pertama, biasanya hingga spasi putih atau baris baru.

Contoh Bacaan:

Contoh pembacaan keyboard dari bilangan bulat (tipe int):

int n;
System.out.print("Introduzca un nmero entero: ");
n = sc.nextInt(); //asigna a la variable n el nmero entero introducido por teclado    

Contoh membaca sejumlah tipe ganda:

double x;
System.out.print("Introduzca nmero de tipo double: ");
x = sc.nextDouble(); //asigna a la variable x el nmero double introducido por teclado 

Contoh membaca string karakter (String):

String s;
System.out.print("Introduzca texto: ");
s = sc.nextLine(); //asigna a la variable s el String introducido por teclado          

Contoh membaca sejumlah jenis panjang:

long ln;
System.out.print("Introduzca un nmero: ");
ln = sc.nextLong(); //asigna a la variable ln el nmero long introducido por teclado   

Jika nilai yang dimasukkan pada keyboard bukan tipe yang diharapkan atau tipe yang kompatibel dengan tipe yang diharapkan, akan terjadi kesalahan. Dalam hal ini pengecualian dilemparkan InputMismatchException

Contoh lengkap program Java membaca data dengan Scanner:

Program meminta pengguna untuk memasukkan namanya di keyboard dan menampilkannya di layar. Selanjutnya, ia meminta nilai jari-jari lingkaran bertipe double untuk dimasukkan pada keyboard dan menampilkan panjang lingkaran. Itu juga meminta bilangan bulat untuk dimasukkan pada keyboard dan menunjukkan kuadratnya.

import java.util.Scanner;  //import de la clase Scanner

public class Ejemplo1Scanner {

    public static void main(String[] args) {  

           Scanner sc = new Scanner(System.in);  //Se crea un objeto Scanner
           String nombre;
           double radio;
           int n;

           System.out.print("Introduzca su nombre: ");       
           nombre = sc.nextLine();  //leer un String
           System.out.println("Hola " + nombre + "!!!");

           System.out.print("Introduzca el radio de la circunferencia: ");
           radio = sc.nextDouble(); //leer un double
           System.out.println("Longitud de la circunferencia: " + 2*Math.PI*radio);                
           
           System.out.print("Introduzca un nmero entero: ");
           n = sc.nextInt(); //leer un entero
           System.out.println("El cuadrado es: " + Math.pow(n,2));
     }
}

Internal kelas Pemindai Java.

Penting untuk memahami cara kerja internal kelas Pemindai agar dapat melakukan operasi baca dengan benar.

Singkatnya, proses membaca keyboard dalam program Java adalah sebagai berikut:

  • Data yang dimasukkan dari keyboard disimpan di area memori yang akan kita panggil penyangga.
  • Melalui a sungai kecil data ini diteruskan ke program.

SEBUAH sungai kecil salah satu aliran data adalah objek yang bertindak sebagai perantara antara program dan sumber atau tujuan data. Program membaca dari atau menulis ke aliran, terlepas dari dari mana asal data secara fisik atau perangkat apa yang sebenarnya digunakan.
Aliran terdiri dari urutan byte yang digunakan untuk input atau output dari suatu program.
Java secara otomatis membuat aliran berikut saat program dijalankan:

Sistem.dalam: masukan aliran terhubung ke papan ketik

Sistem.keluar: aliran output terhubung ke menampilkan

Sistem.err: aliran output terhubung ke menampilkan untuk pesan kesalahan.

Selain ini sungai Sebagai standar, Java menyediakan sejumlah besar kelas untuk aliran yang memungkinkan Anda membaca dan menulis ke file.

  • Saat instruksi muncul di program untuk membaca data dari keyboard, buffer input diakses untuk mencari data. Jika menemukannya, ia mengekstraknya dari buffer dan memasukkannya ke dalam program.
  • Jika data belum ditemukan di buffer, biasanya karena buffer kosong. Ini adalah situasi yang paling umum. Dalam hal ini, program menunggu pengguna memasukkan data pada keyboard. Ketika pengguna memasukkannya dan menekan enter maka nilai yang dimasukkan diambil dari buffer dan dimasukkan ke dalam program.
  • Jika data yang ditemukan bukan tipe yang diharapkan atau tipe yang kompatibel, kesalahan dihasilkan. Dalam hal ini pengecualian dilemparkan InputMismatchException. Hal ini terjadi, misalnya, ketika metode nextInt() dieksekusi untuk mengambil integer dari buffer dan double atau char dimasukkan, misalnya. Tipe data yang ditemukan di buffer tidak cocok dengan tipe yang ingin Anda baca.

Contoh: tindakan internal yang dilakukan saat bilangan bulat dibaca dari keyboard.

int n;
System.out.print("Introduzca un nmero entero: ");     
n = sc.nextInt();  

Menggunakan instruksi sc.nextInt(), Scanner mengakses buffer input untuk mendapatkan data bertipe int dan menugaskannya ke variabel n.

Jika tidak ada apa pun di buffer (yang paling umum), program menunggu nomor dimasukkan. Saat pengguna memasukkan nomor dan menekan enter, nomor tersebut diambil dari buffer dan ditetapkan ke variabel n.

Penting: Saat data dimasukkan dari keyboard, beberapa nilai dapat dimasukkan dipisahkan oleh spasi kosong.

Misalnya, untuk contoh di atas Anda bisa memasukkan:

12 2.1 5

Dengan menggunakan metode kelas Pemindai yang sesuai, token tersebut kemudian dapat diakses dan digunakan dalam program.

Contoh: Tindakan internal yang dilakukan saat Anda ingin membaca bilangan bulat dari keyboard tetapi Anda telah memasukkan beberapa nilai yang dipisahkan oleh spasi kosong.

int n;
System.out.print("Introduzca un nmero entero: ");               
n = sc.nextInt(); 

Kita harus menjelaskan bagaimana Pemindai bekerja dalam kasus ini untuk menghindari kesalahan selama eksekusi program.

Jika dari lokasi penyangga ini pengguna diminta untuk memasukkan bilangan bulat lain:

System.out.print("Introduzca otro nmero entero: ");      
n = sc.nextInt();          
Sekarang secara internal tindakan berikut akan dilakukan:

Untuk menghindari kesalahan ini, kelas Pemindai menyediakan metode untuk mengetahui apakah ada token di buffer dan untuk mengetahui jenis token berikutnya yang akan diekstraksi:

  • hasNext(): Mengembalikan boolean. Menunjukkan apakah ada token berikutnya yang akan diekstraksi atau tidak.
  • hasNextXxx(): Mengembalikan boolean. Menunjukkan apakah token berikutnya yang akan diekstraksi adalah jenis yang ditentukan oleh Xxx, misalnya hasNextInt(), hasNextDouble(), dll.

Contoh:

Program yang membaca bilangan bulat positif dari keyboard. Jika nilai yang dimasukkan bukan bilangan bulat positif, pesan akan ditampilkan dan diminta lagi.

import java.util.Scanner;
public class Ejemplo2Scanner {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              int N;
              do {
                  System.out.print("Introduce un nmero entero positivo: ");
                  while (!sc.hasNextInt()) {
                         System.out.println("Valor no vlido");
                         sc.next();
                         System.out.print("Introduce un nmero entero positivo: ");                               
                  }
                  N = sc.nextInt();
                  if(N <= 0){
                     System.out.println("El nmero debe ser positivo");                                           
                  }
              } while (N <= 0);
              System.out.println("Nmero introducido: " + N);
       }
}

Program ini telah menggunakan metode tersebut hasNextInt() untuk memeriksa apakah nomor yang dimasukkan oleh keyboard bertipe int. Metode hasNextInt() mengakses buffer untuk memeriksa apakah token berikutnya yang akan diekstraksi adalah int. Jika menemukan buffer kosong, ia menunggu pengguna memasukkan nilai dan, setelah dimasukkan, memeriksa jenisnya. Jika bukan int, ia mengembalikan false. While dijalankan selama data yang dimasukkan oleh keyboard bukan tipe int.

Di dalam while ada pernyataan:

sc.next();

Instruksi ini digunakan untuk Ambil nomor tidak valid yang dimasukkan dari buffer. Itu perlu untuk menulisnya di sana karena jika tidak, kita akan menyebabkan while menjadi loop tak terbatas. Data tidak valid yang dimasukkan akan terus berada di buffer, sehingga metode hasNextInt() akan memeriksa kembali apakah data tersebut tidak valid dan melanjutkan tanpa batas.


Metode lain yang dapat berguna saat bekerja dengan Pemindai adalah metodenya gunakanDelimiter(String) yang digunakan untuk menyetel pembatas token baru.

Cara menghapus buffer input di Jawa

Pada contoh sebelumnya kita telah melihat bahwa terkadang perlu untuk mengekstrak data yang tidak valid yang dimasukkan dari buffer input.

Pada contoh, data telah dihilangkan dengan metode next().

Kami dapat menghapus buffer dengan dua metode:

  • Berikutnya() ekstrak dari buffer token berikut dalam bentuk String. Kita harus ingat bahwa metode ini hanya mengekstraksi satu token, jika ada lebih banyak, mereka akan tetap berada di buffer.
  • baris berikutnya()

    mengekstrak dari buffer sebuah String dengan seluruh isi buffer hingga menemukan baris baru. Baris baru tidak termasuk dalam String yang dikembalikan. Baris baru dihapus dari buffer.

Ketika data dari berbagai jenis dimasukkan dari keyboard, akan ada situasi di mana konten buffer input harus dihilangkan sepenuhnya. Jika tidak, pembacaan data tidak akan dilakukan dengan benar, khususnya saat mencoba memasukkan data bertipe String.

Contoh: Program yang membaca nama, umur dan alamat seseorang dari keyboard dan menampilkannya di layar.

import java.util.Scanner;
public class Ejemplo3Scanner {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              String nombre, direccion;
              int edad;
              System.out.print("Introduce tu nombre: ");
              nombre = sc.nextLine(); //leer el nombre
              System.out.print("Introduce tu edad: ");
              edad = sc.nextInt(); //leer la edad
              System.out.print("Introduce tu direccin: ");
              direccion = sc.nextLine(); //leer la direccin                                                      
              System.out.println("Datos introducidos");
              System.out.println("Nombre: " + nombre);
              System.out.println("Edad: " + edad);
              System.out.println("Direccin: " + direccion);                                                      
       }
}

Jika kami menjalankannya, kami melihat bahwa pembacaan data tidak dilakukan dengan benar:

Introduce tu nombre: Juan Redondo
Introduce tu edad: 25
Introduce tu direccin: Datos introducidos                                                                        
Nombre: Juan Redondo
Edad: 25
Direccin:

Nama dan umur telah dibaca oleh keyboard tetapi program belum berhenti bagi pengguna untuk memasukkan alamat, sehingga variabel alamat tetap tanpa nilai.

Penjelasan tentang apa yang telah terjadi dapat dilihat secara grafis:

Pertama nama dimasukkan dengan keyboard:

Operasi baca keyboard berikutnya adalah usia:

Operasi baca keyboard berikutnya adalah alamatnya:

Setelah membaca umur, intro tetap berada di buffer dan jika kita kemudian mencoba membaca sebuah String, pembacaan keyboard akan gagal.

Solusinya sederhana:

Hapus buffer setelah membaca bilangan bulat menggunakan metode nextLine();

Programnya akan terlihat seperti ini:

import java.util.Scanner;
public class Ejemplo3Scanner {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              String nombre, direccion;
              int edad;
              System.out.print("Introduce tu nombre: ");
              nombre = sc.nextLine(); //leer el nombre
              System.out.print("Introduce tu edad: ");
              edad = sc.nextInt(); //leer la edad
			  
              sc.nextLine(); //limpiar el buffer de entrada
			  
              System.out.print("Introduce tu direccin: ");
              direccion = sc.nextLine(); //leer la direccin                                                      
              System.out.println("Datos introducidos");
              System.out.println("Nombre: " + nombre);
              System.out.println("Edad: " + edad);
              System.out.println("Direccin: " + direccion);                                                      
       }
}

Sekarang, setelah memasuki usia, metode nextLine() menghapus intro yang tersisa di buffer sehingga pembacaan alamat akan berhasil.

Introduce tu nombre: Juan Redondo
Introduce tu edad: 25
Introduce tu direccin: C/Mayor 134 - Madrid.                                                                     
Datos introducidos
Nombre: Juan Redondo                                                                                              
Edad: 25
Direccin: C/Mayor 134 - Madrid.

Secara umum seharusnya penyangga bening Input pemindai ketika kita harus memasukkan tipe data String setelah memasukkan tipe data numerik