Java Language
Scanner
Sök…
Syntax
- Scanner scanner = new Scanner (källkälla);
- Scanner scanner = new Scanner (System.in);
parametrar
Parameter | detaljer |
---|---|
Källa | Källan kan vara antingen en av String, File eller någon form av InputStream |
Anmärkningar
Scanner
introducerades i Java 5. reset()
lades till i Java 6, och ett par nya konstruktörer lades till i Java 7 för interoperabilitet med det (då) nya Path
gränssnittet.
Läser systemingång med skanner
Scanner scanner = new Scanner(System.in); //Scanner obj to read System input
String inputTaken = new String();
while (true) {
String input = scanner.nextLine(); // reading one line of input
if (input.matches("\\s+")) // if it matches spaces/tabs, stop reading
break;
inputTaken += input + " ";
}
System.out.println(inputTaken);
Skannerobjektet initialiseras för att läsa inmatning från tangentbordet. Så för nedanstående inmatning från keyboar kommer den att producera utdata som Reading from keyboard
Reading
from
keyboard
//space
Läser filinmatning med skanner
Scanner scanner = null;
try {
scanner = new Scanner(new File("Names.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
System.err.println("Exception occurred!");
} finally {
if (scanner != null)
scanner.close();
}
Här skapas ett Scanner
genom att skicka ett File
innehåller namnet på en textfil som inmatning. Denna textfil öppnas av File-objektet och läses in av skannerobjektet i följande rader. scanner.hasNext()
kommer att kontrollera om det finns en nästa rad med data i textfilen. Om du kombinerar det med en while
slinga kan du iterera igenom varje rad med data i filen Names.txt
. För att hämta själva uppgifterna kan vi använda metoder som nextLine()
, nextInt()
, nextBoolean()
osv. I exemplet ovan används scanner.nextLine()
. nextLine()
hänvisar till följande rad i en textfil och om du kombinerar den med ett scanner
kan du skriva ut innehållet på raden. För att stänga ett .close()
använder du .close()
.
Med hjälp av försök med resurser (från Java 7 och framåt) kan ovannämnda kod skrivas elegant som nedan.
try (Scanner scanner = new Scanner(new File("Names.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
System.err.println("Exception occurred!");
}
Läs hela ingången som en sträng med skanner
Du kan använda Scanner
att läsa all text i ingången som en sträng genom att använda \Z
(hela ingången) som avgränsare. Till exempel kan detta användas för att läsa all text i en textfil på en rad:
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
Kom ihåg att du måste stänga skannern såväl som att fånga den IoException
detta kan kasta, som beskrivs i exemplet Läsa filinmatning med skanner .
Använda anpassade avgränsare
Du kan använda anpassade avgränsare (vanliga uttryck) med Scanner, med .useDelimiter(",")
att bestämma hur ingången läses. Detta fungerar på samma sätt som String.split(...)
. Du kan till exempel använda Scanner
att läsa från en lista med kommaseparerade värden i en sträng:
Scanner scanner = null;
try{
scanner = new Scanner("i,like,unicorns").useDelimiter(",");;
while(scanner.hasNext()){
System.out.println(scanner.next());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (scanner != null)
scanner.close();
}
Detta gör att du kan läsa varje element i ingången individuellt. Observera att du inte bör använda detta för att tolka CSV-data, i stället använda en riktig CSV parser bibliotek, se CSV parser för Java för andra möjligheter.
Allmänt mönster som oftast ställs om uppgifter
Följande är hur du använder java.util.Scanner
klassen för att interaktivt läsa användarinmatning från System.in
korrekt (ibland kallat stdin
, särskilt i C, C ++ och andra språk samt i Unix och Linux). Den visar idiomatiskt de vanligaste sakerna som begärs att göras.
package com.stackoverflow.scanner;
import javax.annotation.Nonnull;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.regex.Pattern;
import static java.lang.String.format;
public class ScannerExample
{
private static final Set<String> EXIT_COMMANDS;
private static final Set<String> HELP_COMMANDS;
private static final Pattern DATE_PATTERN;
private static final String HELP_MESSAGE;
static
{
final SortedSet<String> ecmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
ecmds.addAll(Arrays.asList("exit", "done", "quit", "end", "fino"));
EXIT_COMMANDS = Collections.unmodifiableSortedSet(ecmds);
final SortedSet<String> hcmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
hcmds.addAll(Arrays.asList("help", "helpi", "?"));
HELP_COMMANDS = Collections.unmodifiableSet(hcmds);
DATE_PATTERN = Pattern.compile("\\d{4}([-\\/])\\d{2}\\1\\d{2}"); // http://regex101.com/r/xB8dR3/1
HELP_MESSAGE = format("Please enter some data or enter one of the following commands to exit %s", EXIT_COMMANDS);
}
/**
* Using exceptions to control execution flow is always bad.
* That is why this is encapsulated in a method, this is done this
* way specifically so as not to introduce any external libraries
* so that this is a completely self contained example.
* @param s possible url
* @return true if s represents a valid url, false otherwise
*/
private static boolean isValidURL(@Nonnull final String s)
{
try { new URL(s); return true; }
catch (final MalformedURLException e) { return false; }
}
private static void output(@Nonnull final String format, @Nonnull final Object... args)
{
System.out.println(format(format, args));
}
public static void main(final String[] args)
{
final Scanner sis = new Scanner(System.in);
output(HELP_MESSAGE);
while (sis.hasNext())
{
if (sis.hasNextInt())
{
final int next = sis.nextInt();
output("You entered an Integer = %d", next);
}
else if (sis.hasNextLong())
{
final long next = sis.nextLong();
output("You entered a Long = %d", next);
}
else if (sis.hasNextDouble())
{
final double next = sis.nextDouble();
output("You entered a Double = %f", next);
}
else if (sis.hasNext("\\d+"))
{
final BigInteger next = sis.nextBigInteger();
output("You entered a BigInteger = %s", next);
}
else if (sis.hasNextBoolean())
{
final boolean next = sis.nextBoolean();
output("You entered a Boolean representation = %s", next);
}
else if (sis.hasNext(DATE_PATTERN))
{
final String next = sis.next(DATE_PATTERN);
output("You entered a Date representation = %s", next);
}
else // unclassified
{
final String next = sis.next();
if (isValidURL(next))
{
output("You entered a valid URL = %s", next);
}
else
{
if (EXIT_COMMANDS.contains(next))
{
output("Exit command %s issued, exiting!", next);
break;
}
else if (HELP_COMMANDS.contains(next)) { output(HELP_MESSAGE); }
else { output("You entered an unclassified String = %s", next); }
}
}
}
/*
This will close the underlying Readable, in this case System.in, and free those resources.
You will not be to read from System.in anymore after this you call .close().
If you wanted to use System.in for something else, then don't close the Scanner.
*/
sis.close();
System.exit(0);
}
}
Läs ett int från kommandoraden
import java.util.Scanner;
Scanner s = new Scanner(System.in);
int number = s.nextInt();
Om du vill läsa ett int från kommandoraden använder du bara detta utdrag. Först och främst måste du skapa ett skannerobjekt, som lyssnar på System.in, som som standard är kommandoraden, när du startar programmet från kommandoraden. Efter det läste du med hjälp av Scanner-objektet det första intyget som användaren passerar på kommandoraden och lagrar det i variabelnumret. Nu kan du göra vad du vill med den lagrade int.
Stäng en skanner försiktigt
Det kan hända att du använder en skanner med System.in som parameter för konstruktören, då måste du vara medveten om att stängning av skannern kommer att stänga InputStream för att ge som nästa gång varje försök att läsa ingången på det (eller någon annan skannerobjekt) kommer att kasta en java.util.NoSuchElementException
eller en java.lang.IllegalStateException
exempel:
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
int x1 = sc1.nextInt();
sc1.close();
// java.util.NoSuchElementException
int x2 = sc2.nextInt();
// java.lang.IllegalStateException
x2 = sc1.nextInt();