Jak mogę odczytać dane wejściowe z konsoli za pomocą klasy Scanner w Javie?


224

Jak mogę odczytać dane wejściowe z konsoli za pomocą Scannerklasy? Coś takiego:

System.out.println("Enter your username: ");
Scanner = input(); // Or something like this, I don't know the code

Zasadniczo wszystko, czego chcę, to aby skaner odczytał dane wejściowe dla nazwy użytkownika i przypisał je do Stringzmiennej.



Odpowiedzi:


341

Prosty przykład ilustrujący, jak java.util.Scannerdziała odczytanie jednej liczby całkowitej System.in. To naprawdę bardzo proste.

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();

Aby pobrać nazwę użytkownika, prawdopodobnie bym użył sc.nextLine().

System.out.println("Enter your username: ");
Scanner scanner = new Scanner(System.in);
String username = scanner.nextLine();
System.out.println("Your username is " + username);

Możesz także użyć, next(String pattern)jeśli chcesz mieć większą kontrolę nad danymi wejściowymi lub po prostu zweryfikowaćusername zmienną.

Więcej informacji na temat ich implementacji znajdziesz w Dokumentacji API dlajava.util.Scanner


1
Powiedzmy, że używam skanera tylko raz i nie chcę zaśmiecać mojego kodu podczas inicjowania, a następnie zamykania skanera - czy istnieje sposób na uzyskanie danych wejściowych od użytkownika bez tworzenia klasy?
Nearoo

3
Możesz użyć instrukcji try z zasobem w JDK 8, takiej jak; try (skaner skanera = nowy skaner (System.in)) {}
Rune Vikestad

33
Scanner scan = new Scanner(System.in);
String myLine = scan.nextLine();

24

Odczytywanie danych z konsoli

  • BufferedReaderjest zsynchronizowany, więc operacje odczytu na BufferedReader można bezpiecznie wykonywać z wielu wątków. Można określić rozmiar bufora lub rozmiar domyślny ( 8192 ). Wartość domyślna jest wystarczająco duża dla większości celów.

    readLine () « po prostu odczytuje dane linia po linii ze strumienia lub źródła. Linia jest uważana za zakończoną przez jedną z następujących: \ n, \ r (lub) \ r \ n

  • Scannerdzieli swoje dane wejściowe na tokeny za pomocą wzoru separatora, który domyślnie dopasowuje białe znaki (\ s) i jest rozpoznawany przez Character.isWhitespace.

    « Dopóki użytkownik nie wprowadzi danych, operacja skanowania może zostać zablokowana w oczekiwaniu na dane wejściowe. « Użyj skanera ( BUFFER_SIZE = 1024 ), jeśli chcesz przeanalizować określony typ tokena ze strumienia. « Skaner nie jest jednak bezpieczny dla wątków. Musi być zsynchronizowany zewnętrznie.

    next () «Znajduje i zwraca następny pełny token z tego skanera. nextInt () «Skanuje następny token wejścia jako liczbę całkowitą.

Kod

String name = null;
int number;

java.io.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
name = in.readLine(); // If the user has not entered anything, assume the default value.
number = Integer.parseInt(in.readLine()); // It reads only String,and we need to parse it.
System.out.println("Name " + name + "\t number " + number);

java.util.Scanner sc = new Scanner(System.in).useDelimiter("\\s");
name = sc.next();  // It will not leave until the user enters data.
number = sc.nextInt(); // We can read specific data.
System.out.println("Name " + name + "\t number " + number);

// The Console class is not working in the IDE as expected.
java.io.Console cnsl = System.console();
if (cnsl != null) {
    // Read a line from the user input. The cursor blinks after the specified input.
    name = cnsl.readLine("Name: ");
    System.out.println("Name entered: " + name);
}

Wejścia i wyjścia Stream

Reader Input:     Output:
Yash 777          Line1 = Yash 777
     7            Line1 = 7

Scanner Input:    Output:
Yash 777          token1 = Yash
                  token2 = 777

To jest teraz lepsza, bardziej aktualna odpowiedź niż oryginalne imo.
logicOnAbstractions

Aby uzyskać więcej informacji, zobacz: BufferedReader, Scanneraby odczytać dane z pliku sieciowego pliku lokalnego (OR).
Yash

14

Wystąpił problem z metodą input.nextInt () - odczytuje tylko wartość int.

Tak więc podczas czytania następnego wiersza za pomocą input.nextLine () otrzymujesz „\ n”, czyli Enterklucz. Aby to pominąć, musisz dodać input.nextLine ().

Spróbuj tak:

 System.out.print("Insert a number: ");
 int number = input.nextInt();
 input.nextLine(); // This line you have to add (it consumes the \n character)
 System.out.print("Text1: ");
 String text1 = input.nextLine();
 System.out.print("Text2: ");
 String text2 = input.nextLine();

10

Istnieje kilka sposobów uzyskiwania informacji od użytkownika. W tym programie weźmiemy klasę skanera, aby osiągnąć to zadanie. Ta klasa skanerów jest zaliczana java.util, dlatego pierwszą linią programu jest import java.util.Scanner; co pozwala użytkownikowi odczytać wartości różnych typów w Javie. Wiersz instrukcji importu powinien znajdować się w pierwszym wierszu programu Java, a my kontynuujemy kod.

in.nextInt(); // It just reads the numbers

in.nextLine(); // It get the String which user enters

Aby uzyskać dostęp do metod w klasie Scanner, utwórz nowy obiekt skanera jako „in”. Teraz używamy jednej z jej metod, czyli „next”. Metoda „next” pobiera ciąg tekstu, który użytkownik wprowadza na klawiaturze.

Tutaj używam, in.nextLine();aby uzyskać ciąg, który wprowadza użytkownik.

import java.util.Scanner;

class GetInputFromUser {
    public static void main(String args[]) {
        int a;
        float b;
        String s;

        Scanner in = new Scanner(System.in);
        System.out.println("Enter a string");
        s = in.nextLine();
        System.out.println("You entered string " + s);

        System.out.println("Enter an integer");
        a = in.nextInt();
        System.out.println("You entered integer " + a);

        System.out.println("Enter a float");
        b = in.nextFloat();
        System.out.println("You entered float " + b);
    }
}

9
import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] arguments){
        Scanner input = new Scanner(System.in);

        String username;
        double age;
        String gender;
        String marital_status;
        int telephone_number;

        // Allows a person to enter his/her name   
        Scanner one = new Scanner(System.in);
        System.out.println("Enter Name:" );  
        username = one.next();
        System.out.println("Name accepted " + username);

        // Allows a person to enter his/her age   
        Scanner two = new Scanner(System.in);
        System.out.println("Enter Age:" );  
        age = two.nextDouble();
        System.out.println("Age accepted " + age);

        // Allows a person to enter his/her gender  
        Scanner three = new Scanner(System.in);
        System.out.println("Enter Gender:" );  
        gender = three.next();
        System.out.println("Gender accepted " + gender);

        // Allows a person to enter his/her marital status
        Scanner four = new Scanner(System.in);
        System.out.println("Enter Marital status:" );  
        marital_status = four.next();
        System.out.println("Marital status accepted " + marital_status);

        // Allows a person to enter his/her telephone number
        Scanner five = new Scanner(System.in);
        System.out.println("Enter Telephone number:" );  
        telephone_number = five.nextInt();
        System.out.println("Telephone number accepted " + telephone_number);
    }
}

5
Czy istnieje jakiś szczególny powód, dla którego nowy skaner jest tworzony za każdym razem, czy jest to po prostu kopiowanie i wklejanie bez zrozumienia, jak to działa?
Evgeni Sergeev

1
@EvgeniSergeev new Scanner to obiekt tworzony w celu uzyskania danych wejściowych od użytkownika. czytaj więcej na temat klasy skanera ...
user3598655

zdecydowanie skopiuj wklejone. Nie ma potrzeby nowego skanera za każdym razem (nie jest to również zgodne z konwencją nazewnictwa zmiennych Java).
gnomed

6

Możesz stworzyć prosty program, który zapyta o nazwę użytkownika i wydrukuje dowolne dane wejściowe odpowiedzi.

Możesz też poprosić użytkownika o wprowadzenie dwóch liczb, a następnie możesz dodać, pomnożyć, odjąć lub podzielić te liczby i wydrukować odpowiedzi dla danych wejściowych użytkownika, podobnie jak zachowanie kalkulatora.

Więc potrzebujesz klasy Scanner. Musisz import java.util.Scanner;, aw kodzie musisz użyć:

Scanner input = new Scanner(System.in);

input to nazwa zmiennej.

Scanner input = new Scanner(System.in);

System.out.println("Please enter your name: ");
s = input.next(); // Getting a String value

System.out.println("Please enter your age: ");
i = input.nextInt(); // Getting an integer

System.out.println("Please enter your salary: ");
d = input.nextDouble(); // Getting a double

Zobacz, jak różni: input.next();, i = input.nextInt();,d = input.nextDouble();

Według String, int i double różnią się w ten sam sposób dla reszty. Nie zapomnij instrukcji importu u góry kodu.


2
To właściwie właściwe wytłumaczenie, ale może być jeszcze lepiej, jeśli dodasz do niego więcej metod, takich jak nextLine (), nextLong () .. itd.
subhashis

Uczniowie muszą podążać za przykładami i testować pozostałe metody oraz uczyć się sami, to jest to, co uważam za naukę z własnym doświadczeniem.
user3598655,

4

Prosty przykład:

import java.util.Scanner;

public class Example
{
    public static void main(String[] args)
    {
        int number1, number2, sum;

        Scanner input = new Scanner(System.in);

        System.out.println("Enter First multiple");
        number1 = input.nextInt();

        System.out.println("Enter second multiple");
        number2 = input.nextInt();

        sum = number1 * number2;

        System.out.printf("The product of both number is %d", sum);
    }
}

3

Gdy użytkownik wprowadzi swoje dane username, sprawdź również prawidłowy wpis.

java.util.Scanner input = new java.util.Scanner(System.in);
String userName;
final int validLength = 6; // This is the valid length of an user name

System.out.print("Please enter the username: ");
userName = input.nextLine();

while(userName.length() < validLength) {

    // If the user enters less than validLength characters
    // ask for entering again
    System.out.println(
        "\nUsername needs to be " + validLength + " character long");

    System.out.print("\nPlease enter the username again: ");
    userName = input.nextLine();
}

System.out.println("Username is: " + userName);

2
  1. Aby odczytać dane wejściowe:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Aby odczytać dane wejściowe podczas wywoływania metody z niektórymi argumentami / parametrami:

    if (args.length != 2) {
        System.err.println("Utilizare: java Grep <fisier> <cuvant>");
        System.exit(1);
    }
    try {
        grep(args[0], args[1]);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

1
Powinieneś przeczytać tę stronę pomocy dotyczącą formatowania tekstu / kodu: stackoverflow.com/help/formatting .
Tom

Możesz to przetłumaczyć (z francuskiego?).
Peter Mortensen

2
import java.util.*;

class Ss
{
    int id, salary;
    String name;

   void Ss(int id, int salary, String name)
    {
        this.id = id;
        this.salary = salary;
        this.name = name;
    }

    void display()
    {
        System.out.println("The id of employee:" + id);
        System.out.println("The name of employye:" + name);
        System.out.println("The salary of employee:" + salary);
    }
}

class employee
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);

        Ss s = new Ss(sc.nextInt(), sc.nextInt(), sc.nextLine());
        s.display();
    }
}

2

Oto pełna klasa, która wykonuje wymaganą operację:

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        final int valid = 6;

        Scanner one = new Scanner(System.in);
        System.out.println("Enter your username: ");
        String s = one.nextLine();

        if (s.length() < valid) {
            System.out.println("Enter a valid username");
            System.out.println(
                "User name must contain " + valid + " characters");
            System.out.println("Enter again: ");
            s = one.nextLine();
        }

        System.out.println("Username accepted: " + s);

        Scanner two = new Scanner(System.in);
        System.out.println("Enter your age: ");
        int a = two.nextInt();
        System.out.println("Age accepted: " + a);

        Scanner three = new Scanner(System.in);
        System.out.println("Enter your sex: ");
        String sex = three.nextLine();
        System.out.println("Sex accepted: " + sex);
    }
}

1
Nie ma powodu, aby używać wielu instancji Scanner.
Radiodef,

1

Możesz przepłynąć ten kod:

Scanner obj= new Scanner(System.in);
String s = obj.nextLine();

1
Nie zapewnia to nowych informacji i jest nawet mniej pomocny niż istniejące odpowiedzi z powodu brakujących wyjaśnień.
Tom

1
Co rozumiesz przez „przepływ tego kodu” ? Masz na myśli „przestrzegaj tego kodu” ? Albo coś innego?
Peter Mortensen

0

Możesz użyć klasy Scanner w Javie

Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
System.out.println("String: " + s);

0

Istnieje prosty sposób czytania z konsoli.

Znajdź poniższy kod:

import java.util.Scanner;

    public class ScannerDemo {

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);

            // Reading of Integer
            int number = sc.nextInt();

            // Reading of String
            String str = sc.next();
        }
    }

Szczegółowe informacje można znaleźć w poniższych dokumentach.

Doc

Porozmawiajmy teraz o szczegółowym zrozumieniu działania klasy Scanner:

public Scanner(InputStream source) {
    this(new InputStreamReader(source), WHITESPACE_PATTERN);
}

Jest to konstruktor do tworzenia instancji skanera.

Mijamy tutaj InputStreamodniesienie, które jest niczym innym jak System.In. Tutaj otwiera InputStreampotok dla wejścia konsoli.

public InputStreamReader(InputStream in) {
    super(in);
    try {
        sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## Check lock object
    }
    catch (UnsupportedEncodingException e) {
        // The default encoding should always be available
        throw new Error(e);
    }
}

Po przekazaniu pliku System.in ten kod otworzy gniazdo do odczytu z konsoli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.