1. Gambaran Keseluruhan Pengimbas
Dalam tutorial ringkas ini, kami akan menggambarkan cara menggunakan kelas Java Scanner - untuk membaca input, mencari dan melangkau corak dengan pembatas yang berbeza.
2. Imbas Fail
Pertama - mari kita lihat cara membaca fail menggunakan Pengimbas .
Dalam contoh berikut - kami membaca fail yang mengandungi " 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 bahawa kaedah seterusnya () mengembalikan token String seterusnya di sini.
Juga, perhatikan bagaimana kita menutup pengimbas apabila kita sudah selesai menggunakannya.
3. Tukarkan InputStream ke String
Seterusnya - mari kita lihat cara menukar InputStream menjadi String menggunakan Scanner :
@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(); }
Sama seperti contoh sebelumnya, kami menggunakan Scanner untuk menandai keseluruhan aliran dari awal hingga regex berikutnya "A" - yang sesuai dengan input penuh.
4. Pengimbas vs BufferedReader
Sekarang - mari kita bincangkan perbezaan antara Scanner dan BufferedReader - kita biasanya menggunakan:
- BufferedReader apabila kita mahu membaca input ke dalam baris
- Pengimbas untuk membaca input menjadi token
Dalam contoh berikut - kami membaca fail menjadi 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 fail 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 kita menggunakan Scanner nextLine () API - untuk membaca keseluruhan baris .
5. Imbas Input Dari Konsol Menggunakan Pengimbas Baru (System.in)
Seterusnya - mari kita lihat cara membaca input dari Konsol menggunakan contoh 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 bahawa kami menggunakan System.setIn (…) untuk mensimulasikan beberapa input yang berasal dari Konsol.
5.1. API nextLine ()
Kaedah ini hanya mengembalikan rentetan pada baris semasa:
scanner.nextLine();
Ini membaca kandungan baris semasa dan mengembalikannya kecuali untuk pemisah baris pada akhir - dalam kes ini - watak baris baru.
Setelah membaca kandungannya, Scanner menetapkan kedudukannya ke permulaan baris seterusnya. Perkara penting yang perlu diingat ialah API nextLine () menggunakan pemisah garis dan memindahkan kedudukan Pengimbas ke baris seterusnya .
Oleh itu, jika kita membaca Scanner, kita akan membaca dari awal baris seterusnya.
5.2. API nextInt ()
Kaedah ini mengimbas token input seterusnya sebagai int:
scanner.nextInt();
API membaca token integer yang tersedia seterusnya.
Dalam kes ini, jika token seterusnya adalah bilangan bulat dan setelah bilangan bulat, ada pemisah garis, selalu ingat bahawa nextInt () tidak akan menggunakan pemisah garis. Sebaliknya, kedudukan pengimbas akan menjadi pemisah garis itu sendiri .
Oleh itu, jika kita mempunyai rangkaian operasi, di mana operasi pertama adalah scanner.nextInt () dan kemudian scanner.nextLine () dan sebagai input jika kita memberikan pemecahan bilangan bulat dan garis tekan, kedua-dua operasi akan dijalankan.
The nextInt () API akan memakan integer dan nextLine () API akan memakan pemisah baris dan akan meletakkan Scanner ke permulaan baris berikutnya.
6. Mengesahkan Input
Sekarang - mari kita lihat bagaimana mengesahkan input menggunakan Pengimbas . Dalam contoh berikut - kami menggunakan kaedah 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. Imbas Rentetan
Seterusnya - mari kita lihat cara mengimbas 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: Kaedah nextInt (16) membaca token seterusnya sebagai nilai integer heksadesimal.
8. Cari Corak
Sekarang - mari lihat bagaimana mencari Corak menggunakan Pengimbas .
Dalam contoh berikut - kami menggunakan findInLine () untuk mencari token yang sesuai dengan Pola yang diberikan dalam keseluruhan 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 ; kami juga belajar bagaimana mencari dan melangkau corak menggunakan Pengimbas - serta cara mengubah pembatas Pengimbas .
Pelaksanaan contoh-contoh ini boleh didapati di GitHub.