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();


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow