ฉันจะอ่านอินพุตจากคอนโซลโดยใช้คลาส Scanner ใน Java ได้อย่างไร


224

ฉันจะอ่านอินพุตจากคอนโซลโดยใช้Scannerคลาสได้อย่างไร บางสิ่งเช่นนี้

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

โดยพื้นฐานแล้วสิ่งที่ฉันต้องการก็คือให้สแกนเนอร์อ่านอินพุตสำหรับชื่อผู้ใช้และกำหนดอินพุตให้กับStringตัวแปร



2
ตัวอย่างโค้ดที่ดี: codeflex.co/java-scanner-example-read-from-console
John Detroit

คำตอบ:


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
สมมติว่าฉันใช้เครื่องสแกนเพียงครั้งเดียวและไม่ต้องการถ่วงรหัสของฉันด้วยการเริ่มต้นสแกนเนอร์ก่อนแล้วจึงปิด - มีวิธีรับอินพุตจากผู้ใช้โดยไม่ต้องสร้างคลาสหรือไม่?
Nearoo

3
คุณสามารถใช้ลองกับคำสั่งทรัพยากรใน JDK 8 เช่น; ลอง (สแกนเนอร์สแกนเนอร์ = สแกนเนอร์ใหม่ (System.in)) {}
Rune Vikestad


24

อ่านข้อมูลจากคอนโซล

  • BufferedReaderถูกซิงโครไนซ์ดังนั้นการอ่านบน BufferedReader สามารถทำได้อย่างปลอดภัยจากหลายเธรด อาจระบุขนาดบัฟเฟอร์หรืออาจใช้ขนาดเริ่มต้น ( 8192 ) ค่าเริ่มต้นมีขนาดใหญ่พอสำหรับวัตถุประสงค์ส่วนใหญ่

    readLine () « แค่อ่านบรรทัดข้อมูลทีละบรรทัดจากสตรีมหรือแหล่งที่มา บรรทัดจะถือว่าถูกยกเลิกโดยบุคคลเหล่านี้: \ 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

มีหลายวิธีในการรับอินพุตจากผู้ใช้ ที่นี่ในโปรแกรมนี้เราจะใช้คลาสสแกนเนอร์เพื่อให้งานสำเร็จ คลาสสแกนเนอร์นี้อยู่ภายใต้java.utilดังนั้นบรรทัดแรกของโปรแกรมคือimport java.util.Scanner; ซึ่งอนุญาตให้ผู้ใช้อ่านค่าของชนิดต่าง ๆ ใน Java บรรทัดคำสั่งการนำเข้าควรจะต้องอยู่ในบรรทัดแรกของโปรแกรมจาวาและเราจะดำเนินการเพิ่มเติมสำหรับโค้ด

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

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

ในการเข้าถึงวิธีการในคลาสสแกนเนอร์ให้สร้างวัตถุเครื่องสแกนใหม่เป็น "ใน" ตอนนี้เราใช้วิธีใดวิธีหนึ่งนั่นคือ "ถัดไป" วิธีการ "ถัดไป" จะได้รับสตริงข้อความที่ผู้ใช้ป้อนบนคีย์บอร์ด

ที่นี่ฉันใช้in.nextLine();เพื่อรับ String ที่ผู้ใช้ป้อน

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

1
@EvgeniSergeev new Scanner เป็นวัตถุที่คุณสร้างขึ้นเพื่อรับข้อมูลผู้ใช้ อ่านเพิ่มเติมเกี่ยวกับคลาสเครื่องสแกน ...
user3598655

คัดลอกวางแน่นอน ไม่จำเป็นต้องใช้เครื่องสแกนใหม่ทุกครั้ง (สิ่งนี้ไม่ปฏิบัติตามหลักการตั้งชื่อตัวแปร java)
gnomed

6

คุณสามารถสร้างโปรแกรมอย่างง่ายเพื่อขอชื่อผู้ใช้และพิมพ์สิ่งที่ตอบกลับใช้อินพุต

หรือขอให้ผู้ใช้ป้อนตัวเลขสองตัวและคุณสามารถเพิ่มคูณลบหรือหารตัวเลขเหล่านั้นแล้วพิมพ์คำตอบสำหรับอินพุตของผู้ใช้ได้เช่นเดียวกับพฤติกรรมของเครื่องคิดเลข

ดังนั้นคุณต้องมีคลาสสแกนเนอร์ คุณต้อง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 จะแตกต่างกันไปตามวิธีเดียวกันกับที่เหลือ อย่าลืมคำชี้แจงการนำเข้าที่ด้านบนของรหัสของคุณ


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
สิ่งนี้ไม่ได้ให้ข้อมูลใหม่และมีประโยชน์น้อยกว่าคำตอบที่มีอยู่เนื่องจากคำอธิบายที่ขาดหายไป
Tom

1
คุณหมายถึงอะไรโดย"ไหลรหัสนี้" ? คุณหมายถึง"follow this code"หรือไม่ หรืออย่างอื่น?
ปีเตอร์มอร์เทนเซ่น


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

เพื่อความเข้าใจอย่างละเอียดโปรดดูเอกสารด้านล่าง

คุณหมอ

ตอนนี้เรามาพูดถึงความเข้าใจในรายละเอียดของการทำงานของเครื่องสแกน:

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.