CodeGym /Java blogg /Slumpmässig /Java-skannerklass
John Squirrels
Nivå
San Francisco

Java-skannerklass

Publicerad i gruppen
Hej! Vår lektion idag kommer att bli speciell! I dagens lektion kommer vi att prata om Java Scanner Class. Tidigare var processen att slutföra uppgifter och skriva program enkel: vi skriver lite kod, kör main( )metoden gör programmet vad som krävs och vi är klara. Men nu kommer allt att förändras! Idag ska vi lära oss hur man verkligen interagerar med programmet: vi lär det hur man reagerar på våra handlingar! Innan vi börjar analysera koden, har du någonsin haft att göra med en enhet som en skanner? Förmodligen. Insidan av en skanner är ganska komplicerad, men den grundläggande idén om hur den fungerar är mycket enkel: den läser data som användaren tillhandahåller (som pass eller försäkring) och lagrar denna information i minnet (till exempel som en bild ). Idag ska du skapa din egen skanner! Naturligtvis kommer den inte att kunna hantera pappersdokument, men text kommer inte att vara några problem för det :) Låt oss gå!

Javas skannerklass

Skannerklass - 1Först och främst måste vi bekanta oss med klassen java.util.Scanner . Dess funktionalitet är mycket enkel. Som en riktig skanner läser den data från en källa som du anger. Till exempel en sträng, en fil, konsolen. Därefter känner den igen informationen och bearbetar den på lämpligt sätt. Här är det enklaste exemplet:

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Vi har skapat ett skannerobjekt och angett dess datakälla (en textsträng). NextLine () -metoden kommer åt datakällan (vår text med en quatrain), hittar nästa olästa rad (som är den första raden i det här fallet) och returnerar den. Sedan visar vi det på konsolen: Konsolutgång:

It matters not how strait the gate,
Vi kan använda metoden nextLine() flera gånger och visa hela diktutdraget:

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Varje gång tar vår skanner ett steg framåt och läser nästa rad. Programmets utdata visas:

It matters not how strait the gate, 
How charged with punishments the scroll, 
I am the master of my fate, 
I am the captain of my soul
Som vi redan har sagt behöver skannerns datakälla inte vara en sträng. Det kan till exempel vara konsolen. Några spännande nyheter för dig: tidigare visade vi bara data där, men nu ska vi läsa data från tangentbordet! Låt oss se vad mer Scanner -klassen gör:

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Metoden nextInt () läser och returnerar det angivna numret. I vårt program använder vi det för att tilldela variabelnumret ett värde . Det är redan mer som en riktig skanner! Programmet ber användaren att ange valfritt nummer. Efter att användaren har gjort detta tackar programmet användaren, visar resultatet och avslutar. Men vi har fortfarande ett allvarligt problem. Användaren kan göra ett misstag och ange något fel. Här är ett exempel där vårt nuvarande program slutar fungera:

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Låt oss försöka skriva in strängen "CodeGym" istället för ett nummer: Konsolutgång:

Enter a number: 
CodeGym 
Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextInt(Scanner.java:2117) 
at java.util.Scanner.nextInt(Scanner.java:2076) 
at Main.main(Main.java:10) Process finished with exit code 1
Hoppsan. Vi har stora problem -_- För att undvika sådana situationer måste vi komma på ett sätt att verifiera den data som användaren matat in. Till exempel, om användaren anger något annat än ett nummer, skulle det vara bra att visa en varning om att den angivna informationen inte är ett nummer. Och om informationen är okej, då kan vi bekräfta. Men detta skulle kräva att vi "titta in i framtiden" för att se vad som kommer i vår ström. Kan Scanner göra detta? Och hur! Och den har en mängd metoder för att göra detta: hasNextInt() — Den här metoden kontrollerar om nästa bit av indata är ett tal (returnerar sant eller falskt, beroende på vad som är lämpligt). hasNextLine() — Den här metoden kontrollerar om nästa indatabit är en sträng. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Alla dessa metoder utför liknande kontroller för de återstående datatyperna. Låt oss försöka ändra vårt nummerläsningsprogram:

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Nu kontrollerar vårt program om nästa tecken som anges är ett nummer. Och det visar bara bekräftelse om så är fallet. Om inmatningen inte klarar kontrollen, noterar programmet och ber användaren att försöka igen. I grund och botten kan du kommunicera med Scanner- objektet och ta reda på i förväg vilken datatyp som väntar dig. Ett nummer, en sträng eller något annat? Ett nummer? Och vilken sort? An int , short , long ?" Denna flexibilitet ger dig möjlighet att bygga programlogik som beror på användarens beteende. Vi bör notera en annan viktig metod: useDelimiter() . Du skickar en sträng till denna metod. Strängen innehåller tecken du vill använda som avgränsare eller avgränsare. Anta till exempel att vi plötsligt blev intresserade av japansk poesi och bestämde oss för att använda vår skanner för att läsa haiku skriven av den store poeten Matsuo Bashō. Även om tre olika verser skickas till oss som en besvärlig sträng, kan vi enkelt dela dem och återge dem vackert:

public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Vi använder "\ n /*/*/*" (ny rad tecken och tre asterisker) som vår avgränsare. Som ett resultat har vi vacker konsolutgång, precis som i böcker:
On a withered branch 
A crow has alighted. 
Nightfall in autumn. 

*** 

Such a moon above, 
Like a tree cut at the root: 
The fresh cut is white. 

*** 

How the river floods! 
A heron wanders on short legs, 
Knee-deep in the water.
Det här exemplet har ytterligare en metod som vi absolut måste påpeka: close() . Som alla objekt som arbetar med I/O-strömmar måste skannern vara stängd när den är klar så att den slutar konsumera datorns resurser. Glöm aldrig close() -metoden!

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);
      
       sc.close(); // Now we've done everything right!

   }
}
Det är allt! Som du kan se, för hur användbar den är, är Scanner -klassen ganska lätt att använda! :) För att förstärka det du lärde dig föreslår vi att du tittar på en videolektion från vår Java-kurs
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION