Java skener

1. Pregled Skener

U ovom brzom vodiču ilustrirat ćemo kako se koristi Java Skener razred - za čitanje unosa, pronalaženje i preskakanje uzoraka s različitim graničnicima.

2. Skenirajte datoteku

Prvo - pogledajmo kako čitati datoteku pomoću Skener.

U sljedećem primjeru - čitamo da datoteka sadrži “Pozdrav svijete”U žetone:

@Test public void whenReadFileWithScanner_thenCorrect () baca IOException {Scanner scanner = new Scanner (nova datoteka ("test.txt")); assertTrue (scanner.hasNext ()); assertEquals ("Pozdrav", scanner.next ()); assertEquals ("svijet", scanner.next ()); scanner.close (); }

Imajte na umu da Sljedeći() metoda vraća sljedeću Niz znak ovdje.

Također imajte na umu kako zatvaramo skener kad završimo s upotrebom.

3. Pretvori InputStream do Niz

Dalje - pogledajmo kako pretvoriti InputStream u a Niz pomoću a Skener:

@Test public void whenConvertInputStreamToString_thenConverted () baca IOException {String očekujeValue = "Hello world"; FileInputStream inputStream = novi FileInputStream ("test.txt"); Skener skenera = novi Skener (inputStream); scanner.useDelimiter ("A"); Rezultat niza = scanner.next (); assertEquals (očekivana vrijednost, rezultat); scanner.close (); }

Slično prethodnom primjeru, koristili smo Skener za tokeniziranje cijelog toka od početka do sljedećeg regularnog izraza "A" - koji odgovara punom ulazu.

4. Skener nasuprot BufferedReader

Sada - razgovarajmo o razlici između Skener i BufferedReader - obično koristimo:

  • BufferedReader kada želimo pročitati ulaz u redove
  • Skener za čitanje unosa u žetone

U sljedećem primjeru - datoteku čitamo u retke pomoću BufferedReader:

@Test public void whenReadUsingBufferedReader_thenCorrect () baca IOException {String firstLine = "Hello world"; String secondLine = "Bok, John"; Čitač BufferedReader = novi BufferedReader (novi FileReader ("test.txt")); Rezultat niza = reader.readLine (); assertEquals (firstLine, rezultat); rezultat = čitač.readLine (); assertEquals (secondLine, rezultat); čitač.close (); }

Sada, iskoristimo Skener za čitanje iste datoteke u tokene:

@Test public void whenReadUsingScanner_thenCorrect () baca IOException {String firstLine = "Hello world"; FileInputStream inputStream = novi FileInputStream ("test.txt"); Skener skenera = novi Skener (inputStream); Rezultat niza = scanner.nextLine (); assertEquals (firstLine, rezultat); scanner.useDelimiter (","); assertEquals ("Bok", scanner.next ()); assertEquals ("John", scanner.next ()); scanner.close (); }

Primijetite kako koristimo SkenernextLine () API - pročitati cijeli redak.

5. Koristite skenirani ulaz iz konzole Novi skener (System.in)

Dalje - pogledajmo kako čitati unos s konzole pomoću a Skener primjer:

@Test public void whenReadingInputFromConsole_thenCorrect () {String input = "Hello"; InputStream stdin = System.in; System.setIn (novi ByteArrayInputStream (input.getBytes ())); Skener skenera = novi skener (System.in); Rezultat niza = scanner.next (); assertEquals (ulaz, rezultat); System.setIn (stdin); scanner.close (); }

Imajte na umu da smo koristili System.setIn (…) da simulira neke ulaze koji dolaze iz konzole.

5.1. nextLine () API

Ova metoda jednostavno vraća niz u trenutni redak:

scanner.nextLine ();

Ovim se čita sadržaj trenutnog retka i vraća se, osim bilo kojeg odvajača redaka na kraju - u ovom slučaju - novog znaka retka.

Nakon čitanja sadržaja, Skener postavlja svoj položaj na početak sljedećeg retka. Važno je zapamtiti da nextLine () API troši separator retka i pomiče položaj Skener na sljedeći redak.

Pa sljedeći put ako pročitamo Skener čitat ćemo od početka sljedećeg retka.

5.2. nextInt () API

Ova metoda skenira sljedeći token unosa kao int:

scanner.nextInt ();

API čita sljedeći dostupan token cijelog broja.

U ovom slučaju, ako je sljedeći token cijeli broj, a nakon cijelog broja postoji separator crta, uvijek to zapamtite nextInt () neće trošiti separator crta. Umjesto toga, položaj skenera bit će sam separator crta.

Dakle, ako imamo niz operacija, gdje je prva operacija a scanner.nextInt () i onda scanner.nextLine () i kao ulaz ako pružimo cijeli broj i prekid linije, oba će se postupka izvršiti.

The nextInt () API će potrošiti cijeli broj i nextLine () API će potrošiti separator retka i stavit će ga Skener do početka sljedećeg retka.

6. Potvrdite unos

Sada - da vidimo kako provjeriti valjanost unosa pomoću a Skener. U sljedećem primjeru - koristimo Skener metoda hasNextInt () da biste provjerili je li ulaz cjelobrojna vrijednost:

@Test public void whenValidateInputUsingScanner_thenValidated () baca IOException {String input = "2000"; InputStream stdin = System.in; System.setIn (novi ByteArrayInputStream (input.getBytes ())); Skener skenera = novi skener (System.in); boolean isIntInput = scanner.hasNextInt (); assertTrue (isIntInput); System.setIn (stdin); scanner.close (); }

7. Skeniranje a Niz

Dalje - da vidimo kako skenirati a Niz koristeći Skener:

@Test public void whenScanString_thenCorrect () baca IOException {String input = "Hello 1 F 3.5"; Skener skenera = novi Skener (ulaz); assertEquals ("Pozdrav", scanner.next ()); assertEquals (1, scanner.nextInt ()); assertEquals (15, scanner.nextInt (16)); assertEquals (3.5, scanner.nextDouble (), 0.00000001); scanner.close (); }

Napomena: Metoda nextInt (16) čita sljedeći token kao heksadecimalnu cjelobrojnu vrijednost.

8. Pronađi Uzorak

Sada - da vidimo kako pronaći a Uzorak koristeći Skener.

U sljedećem primjeru - koristimo findInLine () do potražite žeton koji odgovara danom Uzorak u cijelom ulazu:

@Test public void whenFindPatternUsingScanner_thenFound () baca IOException {String očekujeValue = "svijet"; FileInputStream inputStream = novi FileInputStream ("test.txt"); Skener skenera = novi skener (inputStream); Rezultat niza = scanner.findInLine ("wo..d"); assertEquals (očekivana vrijednost, rezultat); scanner.close (); }

Također možemo tražiti a Uzorak u određenoj domeni pomoću findWithinHorizon () kao u sljedećem primjeru:

@Test public void whenFindPatternInHorizon_thenFound () baca IOException {String očekujeValue = "svijet"; FileInputStream inputStream = novi FileInputStream ("test.txt"); Skener skenera = novi Skener (inputStream); Rezultat niza = scanner.findWithinHorizon ("wo..d", 5); assertNull (rezultat); rezultat = scanner.findWithinHorizon ("wo..d", 100); assertEquals (očekivana vrijednost, rezultat); scanner.close (); }

Imajte na umu da horizont pretraživanja je jednostavno broj znakova unutar kojeg se vrši pretraga.

9. Preskoči Uzorak

Dalje - da vidimo kako preskočiti a Uzorak u Skener. Možemo preskočiti žetone koji odgovaraju određenom obrascu tijekom čitanja unosa pomoću Skener.

U sljedećem primjeru - preskačemo “zdravo”Token koristeći Skener metoda preskočiti():

@Test public void whenSkipPatternUsingScanner_thenSkipped () baca IOException {FileInputStream inputStream = new FileInputStream ("test.txt"); Skener skenera = novi Skener (inputStream); scanner.skip (". e.lo"); assertEquals ("svijet", scanner.next ()); scanner.close (); }

10. Promjena Skener Razdjelnik

Napokon - da vidimo kako promijeniti Skener graničnik. U sljedećem primjeru - mijenjamo zadani Skener graničnik za "o“:

@Test public void whenChangeScannerDelimiter_thenChanged () baca IOException {String očekujeValue = "Hello world"; Niz [] podijeljen = očekivana vrijednost.split ("o"); FileInputStream inputStream = novi FileInputStream ("test.txt"); Skener skenera = novi Skener (inputStream); scanner.useDelimiter ("o"); assertEquals (podijeljeno [0], scanner.next ()); assertEquals (podijeljeno [1], scanner.next ()); assertEquals (podijeljeno [2], scanner.next ()); scanner.close (); }

Također možemo koristiti više graničnika. U sljedećem primjeru - koristimo oba zareza “,"I crtica""Kao graničnici za skeniranje datoteke sadrže"Ivan, Adam-Tom“:

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

Napomena: zadano Skener graničnik je razmak.

11. Zaključak

U ovom smo tutorijalu pregledali više stvarnih primjera korištenja Java skener.

Naučili smo kako čitati unos iz datoteke, konzole ili Niz koristeći Skener; Također smo naučili kako pronaći i preskočiti uzorak pomoću Skener - kao i kako promijeniti Skener graničnik.

Implementacija ovih primjera može se naći na GitHubu.