Javaでユーザー入力を取得する方法は?


317

電卓を作成しようとしましたが、ユーザー入力の方法がわからないため、機能しません。

Javaでユーザー入力を取得するにはどうすればよいですか?


8
ええと、あなたの質問は何ですか?あなたはいくつかのコードを投稿し、ポインターが好きではないと述べました。参照渡しと値渡しを理解していない場合、ポインタを理解していなくても、Javaに戻ってしまうことがあります。
スコット

4
あなたは本を読んでJavaを学ぶことを試みるべきです、Java How to Program、7 / eは素晴らしいものです
Marco Aviles

回答:


333

要件に基づいて、次のオプションのいずれかを使用できます。

Scanner クラス

import java.util.Scanner; 
Scanner scan = new Scanner(System.in);
String s = scan.next();
int i = scan.nextInt();

BufferedReaderInputStreamReaderクラス

import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(s);

DataInputStream クラス

import java.io.DataInputStream;
DataInputStream dis = new DataInputStream(System.in);
int i = dis.readInt();

クラスのreadLineメソッドDataInputStream廃止れました。文字列値を取得するには、BufferedReaderで以前のソリューションを使用する必要があります


Console クラス

import java.io.Console;
Console console = System.console();
String s = console.readLine();
int i = Integer.parseInt(console.readLine());

どうやら、このメソッドは一部のIDEではうまく機能しません。


4
DataInputStreamバイナリデータの読み取り用であることに注意してください。使用readInt上のSystem.inではない文字データから整数を解析し、その代わりにUnicode値と戻りナンセンスを再解釈します。詳細DataInput#readIntについては、(DataInputStreamimplements DataInput)を参照してください。
Radiodef

3
これはすばらしいことです。完全性のために必要なインポートが追加されるのを見たいと思います。それは本当にそれを必要とする人々を助けるでしょう。
KnightHawk 2016年

1
この回答は、実際の要件が何であるかを述べていれば、はるかに役立ちます。私はこれを修正しようとする報奨金を始めました。
temporary_user_name

405

最も簡単な方法の1つは、Scanner次のようにオブジェクトを使用することです。

import java.util.Scanner;

Scanner reader = new Scanner(System.in);  // Reading from System.in
System.out.println("Enter a number: ");
int n = reader.nextInt(); // Scans the next token of the input as an int.
//once finished
reader.close();

13
System.inに対して開かれたScannerオブジェクトを閉じると、プログラムが終了するまでSystem.inを再び開くことができません。
ksnortum

@ksnortumで再開できScanner reader1 = new Scanner(System.in);ますか?
Abhijit Jagtap

それを試してみてください。そうは思いません。
ksnortum 2018

1
ええ、ksnortumは正しいです。NoSuchElementExceptionが発生します。System.inを閉じた後、再度開くことができない理由について多少役立つ関連質問。
temporary_user_name

45

ScannerクラスまたはConsoleクラスを使用できます

Console console = System.console();
String input = console.readLine("Enter input:");

55
このコードがEclipseから実行された場合、System.consoleはnullを返すと思います。
Win Coder

13
これは、ほとんどすべてのIDEから実行されているエラーを返すと思います。intelliJにも同じ問題があることを確認しました。
Dan Bradbury、

1
しかし、なぜこれが日食でヌルになるのでしょうか?
マークW

20

を使用してユーザー入力を取得できますBufferedReader

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String accStr;  

System.out.println("Enter your Account number: ");
accStr = br.readLine();

これは、保存するStringに値をaccStrあなたにそれを解析する必要がありますのでint使用しますInteger.parseInt

int accInt = Integer.parseInt(accStr);

17

キーボード入力を取得する方法は次のとおりです。

Scanner scanner = new Scanner (System.in);
System.out.print("Enter your name");  
name = scanner.next(); // Get what the user types.

14

簡単なプログラムを作成してユーザーの名前を要求し、応答で入力を使用する内容を出力できます。

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

だからあなたはスキャナークラスが必要です。あなたはあなたがimport java.util.Scanner;使用する必要があるコードで

Scanner input = new Scanner(System.in);

入力は変数名です。

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ステートメントを忘れないでください。

ブログ投稿「スキャナークラスとユーザー入力の取得」もご覧ください。


12

最適な2つのオプションはBufferedReaderおよびScannerです。

最も広く使用されている方法は Scanner私であり、そのシンプルさと簡単な実装、およびテキストをプリミティブデータに解析する強力なユーティリティのため、私は個人的に好んで使用しています。

スキャナーを使用する利点

  • 使いやすい Scannerクラス
  • 数字入力が簡単 (int、short、byte、float、long、double)
  • 例外はチェックされていないので便利です。文明化され、例外を特定またはキャッチするのはプログラマ次第です。
  • 行、空白、正規表現で区切られたトークンを読み取ることができます

BufferedInputStreamの利点


全体として、各入力メソッドには異なる目的があります。

  • あなたが大量のデータを入力する場合はBufferedReader、あなたのために良いかもしれません

  • あなたがたくさんの数を入力しているなら、Scanner非常に便利な自動解析を行います

より基本的な用途についてScannerは、プログラムの記述が簡単で使いやすいので、私はこの方法をお勧めします。を作成する簡単な例を次に示しますScanner。使用方法の包括的な例を以下に示しますScanner

Scanner scanner = new Scanner (System.in); // create scanner
System.out.print("Enter your name");       // prompt user
name = scanner.next();                     // get user input

(詳細についてBufferedReader、BufferedReaderの使用方法およびCharの行の読み取りを参照してください)


java.util.Scanner

import java.util.InputMismatchException; // import the exception catching class
import java.util.Scanner; // import the scanner class

public class RunScanner {

    // main method which will run your program
    public static void main(String args[]) {

        // create your new scanner
        // Note: since scanner is opened to "System.in" closing it will close "System.in". 
        // Do not close scanner until you no longer want to use it at all.
        Scanner scanner = new Scanner(System.in);

        // PROMPT THE USER
        // Note: when using scanner it is recommended to prompt the user with "System.out.print" or "System.out.println"
        System.out.println("Please enter a number");

        // use "try" to catch invalid inputs
        try {

            // get integer with "nextInt()"
            int n = scanner.nextInt();


            System.out.println("Please enter a decimal"); // PROMPT
            // get decimal with "nextFloat()"
            float f = scanner.nextFloat();


            System.out.println("Please enter a word"); // PROMPT
            // get single word with "next()"
            String s = scanner.next();

            // ---- Note: Scanner.nextInt() does not consume a nextLine character /n 
            // ---- In order to read a new line we first need to clear the current nextLine by reading it:
            scanner.nextLine(); 
            // ----
            System.out.println("Please enter a line"); // PROMPT
            // get line with "nextLine()"
            String l = scanner.nextLine();


            // do something with the input
            System.out.println("The number entered was: " + n);
            System.out.println("The decimal entered was: " + f);
            System.out.println("The word entered was: " + s);
            System.out.println("The line entered was: " + l);


        }
        catch (InputMismatchException e) {
            System.out.println("\tInvalid input entered. Please enter the specified input");
        }

        scanner.close(); // close the scanner so it doesn't leak
    }
}

注:Consoleおよびなどの他のクラスDataInputStreamも実行可能な代替手段です。

Consoleには、パスワードを読み取る機能などのいくつかの強力な機能がありますが、すべてのIDE(Eclipseなど)で使用できるわけではありません。これが発生する理由は、Eclipseがアプリケーションをシステムコンソールのトップレベルプロセスとしてではなく、バックグラウンドプロセスとして実行するためです。ここにConsoleクラスを実装する方法に関する有用な例へのリンクがあります。

DataInputStream主に、基になる入力ストリームから、マシンに依存しない方法で、プリミティブデータ型として入力を読み取るために使用されます。DataInputStream通常、バイナリデータの読み取りに使用されます。また、特定のデータ型を読み取るための便利なメソッドも提供します。たとえば、その中に行をいくつでも含めることができるUTFストリングを読み取るメソッドがあります。

ただし、クラスはより複雑で実装が難しいため、初心者にはお勧めしません。これは、を実装する方法の便利な例へのリンクですDataInputStream


私は先に進み、ここで勝者を呼び出します。たいていはかなり良い答えですが、いつ使用したいかについてさらに深くDataInputStream説明したいと思います。その説明は、Scannerプリミティブへのデータの読み取りの使用例と同じに聞こえます。また、ユーザーがユーザー入力を取得する方法がわからない段階にいる場合、標準ライブラリの一部が特定のIDEで使用できない理由を理解していない可能性があります。確かに私はそうです-なぜConsole利用できないのですか?
temporary_user_name

1
より明確にするために更新を試みたフィードバックに感謝します。quora.com/…およびstackoverflow.com/questions/27601520/…を
JFreeman

完璧です。これがまさにこの質問がずっと必要だった答えです。何らかの方法さえあれば、私はそれをトップにすることができました。
temporary_user_name

まあ、下にスクロールしようとする人は誰でも良い答えを得て、ゆっくりとそれは上がるでしょう:)
JFreeman '28

1
ありがとう。詳細な有益な回答。追加try-with-resourceすることでより良くなります。
ソラバ

8

ここで、プログラムはユーザーに数値の入力を求めます。その後、プログラムは数値の桁と桁の合計を出力します。

import java.util.Scanner;

public class PrintNumber {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = 0;
        int sum = 0;

        System.out.println(
            "Please enter a number to show its digits");
        num = scan.nextInt();

        System.out.println(
            "Here are the digits and the sum of the digits");
        while (num > 0) {
            System.out.println("==>" + num % 10);
            sum += num % 10;
            num = num / 10;   
        }
        System.out.println("Sum is " + sum);            
    }
}

8

行または文字列を読み取るには、次のようにBufferedReaderオブジェクトとオブジェクトを組み合わせて使用できInputStreamReaderます。

BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
String inputLine = bufferReader.readLine();

6

これは質問を使ったあなたのプログラムjava.util.Scannerです:

import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        int input = 0;
        System.out.println("The super insano calculator");
        System.out.println("enter the corrosponding number:");
        Scanner reader3 = new Scanner(System.in);
        System.out.println(
            "1. Add | 2. Subtract | 3. Divide | 4. Multiply");

        input = reader3.nextInt();

        int a = 0, b = 0;

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the first number");
        // get user input for a
        a = reader.nextInt();

        Scanner reader1 = new Scanner(System.in);
        System.out.println("Enter the scend number");
        // get user input for b
        b = reader1.nextInt();

        switch (input){
            case 1:  System.out.println(a + " + " + b + " = " + add(a, b));
                     break;
            case 2:  System.out.println(a + " - " + b + " = " + subtract(a, b));
                     break;
            case 3:  System.out.println(a + " / " + b + " = " + divide(a, b));
                     break;
            case 4:  System.out.println(a + " * " + b + " = " + multiply(a, b));
                     break;
            default: System.out.println("your input is invalid!");
                     break;
        }
    }

    static int      add(int lhs, int rhs) { return lhs + rhs; }
    static int subtract(int lhs, int rhs) { return lhs - rhs; }
    static int   divide(int lhs, int rhs) { return lhs / rhs; }
    static int multiply(int lhs, int rhs) { return lhs * rhs; }
}

3
それほど多くのScannerオブジェクトを作成する必要はありません。1つで十分だったでしょう。
jub0bs 2015年

5

Systemクラスを使用して入力を取得します。

http://fresh2refresh.com/java-tutorial/java-input-output/

キーボードからデータはどのように受け入れられますか?

3つのオブジェクトが必要です。

  1. System.in
  2. InputStreamReader
  3. BufferedReader

    • InputStreamReaderとBufferedReaderは、java.ioパッケージのクラスです。
    • データは、InputStreamオブジェクトであるSystem.inによってキーボードからバイトの形式で受信されます。
    • 次に、InputStreamReaderはバイトを読み取り、それらを文字にデコードします。
    • 次に、BufferedReaderオブジェクトが文字入力ストリームからテキストを読み取り、文字をバッファリングして、文字、配列、および行を効率的に読み取ります。
InputStreamReader inp = new InputStreamReader(system.in);
BufferedReader br = new BufferedReader(inp);

1
System.in(intのコードの最初の行)はS、クラス名の資本を持ちます。
KNU 2014

5
スキャナー入力=新しいスキャナー(System.in);
int integer = input.nextInt();
文字列string = input.next();
long longInteger = input.nextLong();

5

ほんの1つの余分な詳細。メモリ/リソースリークの危険を冒したくない場合は、終了時にスキャナーストリームを閉じる必要があります。

myScanner.close();

Java 1.7以降では、これがコンパイル警告としてキャッチされることに注意してください(私がそれを知っているかどうかは尋ねないでください:-)


しかし、ではないスキャナがSystem.inに開いている場合。プログラムで再度System.inにスキャナーを開くことはできません。
ksnortum 2017


4
import java.util.Scanner; 

class Daytwo{
    public static void main(String[] args){
        System.out.println("HelloWorld");

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the number ");

        int n = reader.nextInt();
        System.out.println("You entered " + n);

    }
}

4

以下は、2つの一般的なニーズに対応する、承認された回答のより開発されたバージョンです。

  • 終了値が入力されるまでユーザー入力を繰り返し収集する
  • 無効な入力値の処理(この例では整数以外)

コード

package inputTest;

import java.util.Scanner;
import java.util.InputMismatchException;

public class InputTest {
    public static void main(String args[]) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Please enter integers. Type 0 to exit.");

        boolean done = false;
        while (!done) {
            System.out.print("Enter an integer: ");
            try {
                int n = reader.nextInt();
                if (n == 0) {
                    done = true;
                }
                else {
                    // do something with the input
                    System.out.println("\tThe number entered was: " + n);
                }
            }
            catch (InputMismatchException e) {
                System.out.println("\tInvalid input type (must be an integer)");
                reader.nextLine();  // Clear invalid input from scanner buffer.
            }
        }
        System.out.println("Exiting...");
        reader.close();
    }
}

Please enter integers. Type 0 to exit.
Enter an integer: 12
    The number entered was: 12
Enter an integer: -56
    The number entered was: -56
Enter an integer: 4.2
    Invalid input type (must be an integer)
Enter an integer: but i hate integers
    Invalid input type (must be an integer)
Enter an integer: 3
    The number entered was: 3
Enter an integer: 0
Exiting...

がなけれnextLine()ば、不正な入力が無限ループで同じ例外を繰り返しトリガーすることに注意してください。next()状況によっては代わりに使用したいかもしれませんが、入力this has spacesが複数の例外を生成することを知っています。


3

throws IOExceptionmain()に追加し、

DataInputStream input = new DataInputStream(System.in);
System.out.print("Enter your name");
String name = input.readLine();

3

Javaで入力を取得するのは非常に簡単です。

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

同じことです。データ型varName [] OR datatype [] varNameを使用して、常に配列を初期化できます
user2277872

3
import java.util.Scanner;

public class Myapplication{
     public static void main(String[] args){
         Scanner in = new Scanner(System.in);
         int a;
         System.out.println("enter:");
         a = in.nextInt();
         System.out.println("Number is= " + a);
     }
}

2

BufferedReaderを使用して、次のようなユーザー入力を取得できます。

    InputStreamReader inp = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(inp);
    // you will need to import these things.

これはあなたがそれらを適用する方法です

    String name = br.readline(); 

したがって、ユーザーが自分の名前をコンソールに入力すると、「文字列名」にその情報が保存されます。

保存したい数値の場合、コードは次のようになります。

    int x = Integer.parseInt(br.readLine());

これが役に立てば幸い!


2

このようなものにすることができます...

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

    System.out.println("Enter a number: ");
    int i = reader.nextInt();
    for (int j = 0; j < i; j++)
        System.out.println("I love java");
}

1

これは、System.in.read()関数を使用する単純なコードです。このコードは、入力されたものを書き出すだけです。入力を1回だけ取得したい場合は、whileループを取り除くことができます。必要に応じて、回答を文字配列に格納できます。

package main;

import java.io.IOException;

public class Root 
{   
    public static void main(String[] args)
    {
        new Root();
    }

    public Root()
    {
        while(true)
        {
            try
            {
                for(int y = 0; y < System.in.available(); ++y)
                { 
                    System.out.print((char)System.in.read()); 
                }
            }
            catch(IOException ex)
            {
                ex.printStackTrace(System.out);
                break;
            }
        }
    }   
}    

1

私は以下が好きです:

public String readLine(String tPromptString) {
    byte[] tBuffer = new byte[256];
    int tPos = 0;
    System.out.print(tPromptString);

    while(true) {
        byte tNextByte = readByte();
        if(tNextByte == 10) {
            return new String(tBuffer, 0, tPos);
        }

        if(tNextByte != 13) {
            tBuffer[tPos] = tNextByte;
            ++tPos;
        }
    }
}

たとえば、私はそうします:

String name = this.readLine("What is your name?")

1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("Welcome to the best program in the world! ");
        while (true) {
            System.out.print("Enter a query: ");
            Scanner scan = new Scanner(System.in);
            String s = scan.nextLine();
            if (s.equals("q")) {
                System.out.println("The program is ending now ....");
                break;
            } else  {
                System.out.println("The program is running...");
            }
        }
    }
}

0

を使用してユーザー入力を取得できますScannernext()for StringnextInt()for などのさまざまなデータ型に適切なメソッドを使用して、適切な入力検証を使用できますInteger

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);

//reads the input until it reaches the space
System.out.println("Enter a string: ");
String str = scanner.next();
System.out.println("str = " + str);

//reads until the end of line
String aLine = scanner.nextLine();

//reads the integer
System.out.println("Enter an integer num: ");
int num = scanner.nextInt();
System.out.println("num = " + num);

//reads the double value
System.out.println("Enter a double: ");
double aDouble = scanner.nextDouble();
System.out.println("double = " + aDouble);


//reads the float value, long value, boolean value, byte and short
double aFloat = scanner.nextFloat();
long aLong = scanner.nextLong();
boolean aBoolean = scanner.nextBoolean();
byte aByte = scanner.nextByte();
short aShort = scanner.nextShort();

scanner.close();

0

ユーザー入力を取得する最も簡単な方法は、スキャナーを使用することです。使用方法の例を次に示します。

import java.util.Scanner;
public class main {
public static void main(String[]args) {
Scanner sc=new Scanner(System.in);
int a;
String b;
System.out.println("Type an integer here: ");
a=sc.nextInt();
System.out.println("Type anything here:");
b=sc.nextLine();

コード行はimport java.util.Scanner;、プログラマーがコードでユーザー入力を使用することをプログラムに通知します。それが言うように、スキャナーユーティリティをインポートします。Scanner sc=new Scanner(System.in);ユーザー入力を開始するようにプログラムに指示します。その後、文字列または整数を値なしで作成し、それらを行a=sc.nextInt();またはに配置する必要がありa=sc.nextLine();ます。これにより、変数にユーザー入力の値が与えられます。その後、コードで使用できます。お役に立てれば。


-1
import java.util.Scanner;

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

        System.out.print("Name : ");
        String name = input.next();
        System.out.print("Last Name : ");
        String lname = input.next();
        System.out.print("Age : ");
        byte age = input.nextByte();

        System.out.println(" " );
        System.out.println(" " );

        System.out.println("Firt Name: " + name);
        System.out.println("Last Name: " + lname);
        System.out.println("      Age: " + age);
    }
}

-1
class ex1 {    
    public static void main(String args[]){
        int a, b, c;
        a = Integer.parseInt(args[0]);
        b = Integer.parseInt(args[1]);
        c = a + b;
        System.out.println("c = " + c);
    }
}
// Output  
javac ex1.java
java ex1 10 20 
c = 30

args最初にその配列の長さをチェックせずにの要素にアクセスするための制裁:ダウン投票。
jub0bs 2015年


-1

他のユーザーが投稿したように、スキャナーを使用したキーボード入力が可能です。しかし、これらの非常にグラフィックの時代では、グラフィカルユーザーインターフェイス(GUI)なしで電卓を作成しても意味がありません。

最近のJavaでは、これはScene BuilderのようなJavaFXドラッグアンドドロップツールを使用して、電卓のコンソールに似たGUIをレイアウトすることを意味します。シーンビルダーの使用は直感的に簡単で、イベントハンドラーに追加のJavaスキルを必要としないことに注意してください。

ユーザー入力の場合、GUIコンソールの上部に幅の広いTextFieldが必要です。

これは、ユーザーが機能を実行したい番号を入力する場所です。TextFieldの下には、基本的な(つまり、加算/減算/乗算/除算およびメモリ/リコール/クリア)関数を実行する機能ボタンの配列があります。GUIが配置されたら、各ボタン関数をそのJava実装にリンクする「コントローラー」参照を追加できます(プロジェクトのコントローラークラスのメソッドの呼び出しなど)。

このビデオは少し古いですが、シーンビルダーがいかに簡単かを示しています。


この回答は反対投票されました-理由はありません。私にとって、それはユーザー入力をJavaアプリケーションに取り込む唯一の使用可能な方法です。
トランク

これは非常に便利で、なぜ反対票が投じられたのかわかりません。ただし、現在の回答と報奨金の説明は、コンソールを介して入力を取得したい将来のユーザーのための回答を探していることを示しています。
JFreeman、

私は、Javaユーザーが、古いバージョンのJavaで記述されたコードで立ち往生していないかぎり、スキャナーのキーボード入力になんらかの用途があるとは思いません。前回、賞金で結ばれた投稿に回答します。。。
トランク

申し立てを完全に理解しました。私は個人的に、あなたの回答が非常に役立つので、なぜ反対票が投じられたのかわかりません。しかし、私は多くの場合、GUIを持たないプログラムを作成しているので、aの適切なコードをScanner入手できると非常に良いと思います。
JFreeman、

OPが、画面I / Oが最小限かまったくない、オーバーヘッドの少ない(組み込み?)プロセスであると言った場合、十分に公正です-スキャナーが必要です。しかし、彼らはそのようなことを述べていません。OPは基本的に、この「ユーザー入力」というフレーズは主にキーボード入力を示唆していることを受け入れるか、または自分自身でフレーズを解釈するように私たちを招待するように私たちに求めました。。。
トランク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.