Pemindai Java

1. Gambaran Umum Scanner

Dalam tutorial singkat ini, kami akan mengilustrasikan cara menggunakan kelas Java Scanner - untuk membaca masukan, menemukan, dan melewati pola dengan pembatas yang berbeda.

2. Pindai File

Pertama - mari kita lihat cara membaca file menggunakan Scanner .

Dalam contoh berikut - kita membaca file yang berisi " Hello world " menjadi token:

@Test public void whenReadFileWithScanner_thenCorrect() throws IOException{ Scanner scanner = new Scanner(new File("test.txt")); assertTrue(scanner.hasNext()); assertEquals("Hello", scanner.next()); assertEquals("world", scanner.next()); scanner.close(); }

Perhatikan bahwa metode next () mengembalikan token String berikutnya di sini.

Juga, perhatikan bagaimana kami menutup pemindai setelah selesai menggunakannya.

3. Ubah InputStream ke String

Selanjutnya - mari kita lihat cara mengubah InputStream menjadi String menggunakan Pemindai :

@Test public void whenConvertInputStreamToString_thenConverted() throws IOException { String expectedValue = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("A"); String result = scanner.next(); assertEquals(expectedValue, result); scanner.close(); }

Mirip dengan contoh sebelumnya, kami menggunakan Pemindai untuk membuat token seluruh aliran dari awal hingga regex berikutnya "A" - yang cocok dengan input penuh.

4. Scanner vs. BufferedReader

Sekarang - mari kita bahas perbedaan antara Scanner dan BufferedReader - biasanya kami menggunakan:

  • BufferedReader saat kita ingin membaca input menjadi baris
  • Pemindai untuk membaca masukan menjadi token

Dalam contoh berikut - kita membaca file menjadi beberapa baris menggunakan BufferedReader :

@Test public void whenReadUsingBufferedReader_thenCorrect() throws IOException { String firstLine = "Hello world"; String secondLine = "Hi, John"; BufferedReader reader = new BufferedReader(new FileReader("test.txt")); String result = reader.readLine(); assertEquals(firstLine, result); result = reader.readLine(); assertEquals(secondLine, result); reader.close(); }

Sekarang, mari gunakan Scanner untuk membaca file yang sama menjadi token:

@Test public void whenReadUsingScanner_thenCorrect() throws IOException { String firstLine = "Hello world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.nextLine(); assertEquals(firstLine, result); scanner.useDelimiter(", "); assertEquals("Hi", scanner.next()); assertEquals("John", scanner.next()); scanner.close(); }

Perhatikan bagaimana kami menggunakan API Scanner nextLine () - untuk membaca seluruh baris .

5. Pindai Input Dari Konsol Menggunakan Pemindai Baru (System.in)

Selanjutnya - mari kita lihat cara membaca input dari Konsol menggunakan instance Scanner :

@Test public void whenReadingInputFromConsole_thenCorrect() { String input = "Hello"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); String result = scanner.next(); assertEquals(input, result); System.setIn(stdin); scanner.close(); }

Perhatikan bahwa kami menggunakan System.setIn (…) untuk mensimulasikan beberapa masukan yang berasal dari Konsol.

5.1. API nextLine ()

Metode ini hanya mengembalikan string pada baris saat ini:

scanner.nextLine();

Ini membaca konten baris saat ini dan mengembalikannya kecuali untuk pemisah baris di akhir - dalam hal ini - karakter baris baru.

Setelah membaca konten, Scanner mengatur posisinya ke awal baris berikutnya. Poin penting untuk diingat adalah bahwa nextLine () API menggunakan pemisah baris dan memindahkan posisi Pemindai ke baris berikutnya .

Jadi lain kali jika kita membaca Pemindai, kita akan membaca dari awal baris berikutnya.

5.2. nextInt () API

Metode ini memindai token input berikutnya sebagai int:

scanner.nextInt();

API membaca token integer yang tersedia berikutnya.

Dalam hal ini, jika token berikutnya adalah bilangan bulat dan setelah bilangan bulat, ada pemisah baris, selalu ingat bahwa nextInt () tidak akan menggunakan pemisah baris. Sebaliknya, posisi pemindai akan menjadi pemisah garis itu sendiri .

Jadi jika kita memiliki rangkaian operasi, di mana operasi pertama adalah scanner.nextInt () dan kemudian scanner.nextLine () dan sebagai input jika kita memberikan bilangan bulat dan garis tekan break, kedua operasi tersebut akan dijalankan.

The nextInt () API akan mengkonsumsi bilangan bulat dan nextLine () API akan mengkonsumsi garis pemisah dan akan menempatkan Scanner ke awal baris berikutnya.

6. Validasi Input

Sekarang - mari kita lihat cara memvalidasi input menggunakan Scanner . Dalam contoh berikut - kami menggunakan metode Scanner hasNextInt () untuk memeriksa apakah input adalah nilai integer:

@Test public void whenValidateInputUsingScanner_thenValidated() throws IOException { String input = "2000"; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(input.getBytes())); Scanner scanner = new Scanner(System.in); boolean isIntInput = scanner.hasNextInt(); assertTrue(isIntInput); System.setIn(stdin); scanner.close(); }

7. Pindai String

Selanjutnya - mari kita lihat cara memindai String menggunakan Scanner :

@Test public void whenScanString_thenCorrect() throws IOException { String input = "Hello 1 F 3.5"; Scanner scanner = new Scanner(input); assertEquals("Hello", scanner.next()); assertEquals(1, scanner.nextInt()); assertEquals(15, scanner.nextInt(16)); assertEquals(3.5, scanner.nextDouble(), 0.00000001); scanner.close(); }

Catatan: Metode nextInt (16) membaca token berikutnya sebagai nilai integer heksadesimal.

8. Temukan Pola

Sekarang - mari kita lihat bagaimana menemukan Pola menggunakan Scanner .

Dalam contoh berikut - kami menggunakan findInLine () untuk mencari token yang cocok dengan Pola yang diberikan di seluruh input:

@Test public void whenFindPatternUsingScanner_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findInLine("wo..d"); assertEquals(expectedValue, result); scanner.close(); }

We can also search for a Pattern in the specific domain using findWithinHorizon() as in the following example:

@Test public void whenFindPatternInHorizon_thenFound() throws IOException { String expectedValue = "world"; FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); String result = scanner.findWithinHorizon("wo..d", 5); assertNull(result); result = scanner.findWithinHorizon("wo..d", 100); assertEquals(expectedValue, result); scanner.close(); }

Note that the search horizon is simply the number of characters within which the search is performed.

9. Skip Pattern

Next – let's see how to skip a Pattern in Scanner. We can skip tokens that match a specific pattern while reading the input using Scanner.

In the following example – we skip “Hello” token using the Scanner method skip():

@Test public void whenSkipPatternUsingScanner_thenSkipped() throws IOException { FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.skip(".e.lo"); assertEquals("world", scanner.next()); scanner.close(); }

10. Change Scanner Delimiter

Finally – let's see how to change the Scanner delimiter. In the following example – we change the default Scanner delimiter to “o“:

@Test public void whenChangeScannerDelimiter_thenChanged() throws IOException { String expectedValue = "Hello world"; String[] splited = expectedValue.split("o"); FileInputStream inputStream = new FileInputStream("test.txt"); Scanner scanner = new Scanner(inputStream); scanner.useDelimiter("o"); assertEquals(splited[0], scanner.next()); assertEquals(splited[1], scanner.next()); assertEquals(splited[2], scanner.next()); scanner.close(); }

We can also use multiple delimiters. In the following example – we use both commas “,” and dash”” as delimiters to scan a file contains “John,Adam-Tom“:

@Test public void whenReadWithScannerTwoDelimiters_thenCorrect() throws IOException -"); assertEquals("John", scanner.next()); assertEquals("Adam", scanner.next()); assertEquals("Tom", scanner.next()); scanner.close(); 

Note: The default Scanner delimiter is whitespace.

11. Conclusion

In this tutorial, we went over multiple real-world examples of using the Java Scanner.

Kami belajar membaca input dari file, Console atau String menggunakan Scanner ; kita juga belajar cara mencari dan melewati pola menggunakan Scanner - serta cara mengubah pembatas Scanner .

Penerapan contoh-contoh ini dapat ditemukan di GitHub.