JavaのScannerクラスを使用してコンソールから入力を読み取るにはどうすればよいですか?


224

Scannerクラスを使用してコンソールから入力を読み取るにはどうすればよいですか?このようなもの:

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

基本的に、必要なのは、スキャナーにユーザー名の入力を読み取らせ、その入力をString変数に割り当てることだけです。



回答:


341

がどのようにjava.util.Scanner機能するかを説明する簡単な例は、から単一の整数を読み取ることSystem.inです。とてもシンプルです。

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

ユーザー名を取得するには、おそらくを使用します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);

next(String pattern)入力をさらに制御したい場合や、username変数を検証する場合にも使用できます。

これらの実装の詳細については、APIドキュメントを参照してください。java.util.Scanner


1
スキャナーを1回だけ使用し、スキャナーを初期化してから閉じることでコードを整理したくないとしましょう。クラスを構築せずにユーザーから入力を取得する方法はありますか?
Nearoo

3
次のようなJDK 8では、try with resourceステートメントを使用できます。try(Scanner scanner = new Scanner(System.in)){}
Rune Vikestad

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

24

コンソールからのデータの読み取り

  • BufferedReaderは同期されているため、BufferedReaderの読み取り操作は複数のスレッドから安全に実行できます。バッファサイズを指定するか、デフォルトのサイズ(8192)を使用できます。デフォルトは、ほとんどの目的に十分な大きさです。

    readLine() « ストリームまたはソースから1行ずつデータを読み取るだけです。行は次のいずれかで終了すると見なされます:\ n、\ r(または)\ r \ n

  • Scannerは、デフォルトで空白(\ s)に一致し、によって認識される区切り文字パターンを使用して、入力をトークンに分割しますCharacter.isWhitespace

    « ユーザーがデータを入力するまで、スキャン操作がブロックされ、入力を待機する場合があります。 « ストリームから特定のタイプのトークンを解析する場合は、スキャナー(BUFFER_SIZE = 1024)を使用します。 « ただし、スキャナーはスレッドセーフではありません。外部で同期する必要があります。

    next()«このスキャナーから次の完全なトークンを見つけて返します。nextInt()«入力の次のトークンをintとしてスキャンします。

コード

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

ストリームの入力と出力

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

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

これは、元のimoよりも優れた最新の回答です。
logicOnAbstractions

詳細についてBufferedReader, Scannerは、ローカルファイル(OR)ネットワークファイルからデータを読み取るを参照してください。
Yash

14

input.nextInt()メソッドに問題があります-int値のみを読み取ります。

したがって、input.nextLine()を使用して次の行を読み取ると、「\ n」、つまりEnterキーを受け取ります。これをスキップするには、input.nextLine()を追加する必要があります。

そのようにしてみてください:

 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

ユーザーからの入力を取得する方法はいくつかあります。このプログラムでは、Scannerクラスを使用してタスクを実行します。このScannerクラスはに含まれるjava.utilため、プログラムの最初の行はimport java.util.Scannerです。これにより、ユーザーはJavaでさまざまなタイプの値を読み取ることができます。importステートメントの行は、Javaプログラムの最初の行にある必要があります。コードをさらに進めます。

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

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

Scannerクラスのメソッドにアクセスするには、「in」として新しいスキャナーオブジェクトを作成します。ここで、その方法の1つである「次へ」を使用します。「next」メソッドは、ユーザーがキーボードで入力したテキストの文字列を取得します。

ここではin.nextLine();、ユーザーが入力する文字列を取得するために使用しています。

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
毎回新しいスキャナーが作成される特別な理由はありますか、それともそれがどのように機能するのか理解せずに単にコピーして貼り付けるだけですか?
Evgeni Sergeev 2015年

1
@EvgeniSergeev new Scannerは、ユーザー入力を取得するために作成するオブジェクトです。Scannerクラスの詳細を読む...
user3598655

間違いなくコピー貼り付けます。毎回新しいスキャナーを使用する必要はありません(これもjava変数の命名規則に従っていません)。
無視

6

簡単なプログラムを作成して、ユーザーの名前を要求し、返信が入力を使用するものを印刷することができます。

または、ユーザーに2つの数値を入力するように依頼すると、それらの数値を加算、乗算、減算、または除算して、電卓の動作と同じようにユーザー入力の回答を印刷できます。

したがって、Scannerクラスが必要です。あなたはしなければならずimport java.util.Scanner;、そしてあなたは使用する必要があるコードで:

Scanner input = new Scanner(System.in);

input 変数名です。

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

どのようにこの異なりを参照してください:input.next();i = input.nextInt();d = input.nextDouble();

文字列によると、intとdoubleは、残りの部分でも同じように変化します。コードの先頭にあるimportステートメントを忘れないでください。


2
これは実際には適切な説明ですが、nextLine()、nextLong()などのいくつかのメソッドを追加するとさらに良い場合があります
subhashis

生徒は例に従い、残りの方法をテストし、自分自身で学習する必要があります。これは、自分の経験で学ぶと私が信じていることです。
user3598655

4

簡単な例:

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

ユーザーがを入力するときはusername、有効な入力も確認してください。

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. 入力を読み取るには:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. いくつかの引数/パラメーターを使用してメソッドを呼び出すときに入力を読み取るには:

    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
テキスト/コードのフォーマットについては、このヘルプページをご覧ください:stackoverflow.com/help/formatting
トム

あなたはそれを(フランス語から?)翻訳したいと思うかもしれません。
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

以下は、必要な操作を実行する完全なクラスです。

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
の複数のインスタンスを使用する理由はありませんScanner
Radiodef

1

あなたはこのコードを流すことができます:

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

1
これは新しい情報を提供するものではなく、説明が欠落しているため、既存の回答よりもさらに役立ちません。
トム

1
「このコードをフローするとはどういう意味ですか?「このコードに従う」という意味ですか?または、他の何か?
Peter Mortensen 2018年


0

コンソールから読み取る簡単な方法があります。

以下のコードを見つけてください:

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

詳細については、以下のドキュメントを参照してください。

ドク

次に、Scannerクラスの動作の詳細について説明します。

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

これは、スキャナーインスタンスを作成するためのコンストラクターです。

ここでは、に過ぎInputStreamない参照を渡していますSystem.In。ここでは、InputStreamコンソール入力用のパイプを開きます。

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

System.inを渡すことにより、このコードはコンソールから読み取るためのソケットを開きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.