Zoeken…


Gebruikersinvoer lezen vanaf de console

BufferedReader :

System.out.println("Please type your name and press Enter.");

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
    String name = reader.readLine();
    System.out.println("Hello, " + name + "!");
} catch(IOException e) {
    System.out.println("An error occurred: " + e.getMessage());
}

De volgende invoer is nodig voor deze code:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

Scanner :

Java SE 5
System.out.println("Please type your name and press Enter");

Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();

System.out.println("Hello, " + name + "!");

De volgende import is nodig voor dit voorbeeld:

import java.util.Scanner;

scanner.nextLine() herhaaldelijk op om meer dan één regel te lezen:

System.out.println("Please enter your first and your last name, on separate lines.");
    
Scanner scanner = new Scanner(System.in);
String firstName = scanner.nextLine();
String lastName = scanner.nextLine();
    
System.out.println("Hello, " + firstName + " " + lastName + "!");

Er zijn twee methoden voor het verkrijgen van Strings , next() en nextLine() . next() retourneert tekst tot de eerste spatie (ook bekend als een "token"), en nextLine() retourneert alle tekst die de gebruiker heeft ingevoerd totdat op enter werd nextLine() .

Scanner biedt ook hulpprogramma's voor het lezen van andere gegevenstypen dan String . Waaronder:

scanner.nextByte();
scanner.nextShort();
scanner.nextInt();
scanner.nextLong();
scanner.nextFloat();
scanner.nextDouble();
scanner.nextBigInteger();
scanner.nextBigDecimal();

Het voorvoegen van een van deze methoden met has (zoals in hasNextLine() , hasNextInt() ) retourneert true als de stream meer van het verzoektype heeft. Opmerking: Met deze methoden wordt het programma gecrasht als de invoer niet van het gevraagde type is (bijvoorbeeld "a" typen voor nextInt() ). U kunt een try {} catch() {} gebruiken om dit te voorkomen (zie: Uitzonderingen )

Scanner scanner = new Scanner(System.in); //Create the scanner
scanner.useLocale(Locale.US); //Set number format excepted
System.out.println("Please input a float, decimal separator is .");
if (scanner.hasNextFloat()){ //Check if it is a float
    float fValue = scanner.nextFloat(); //retrive the value directly as float
    System.out.println(fValue + " is a float");
}else{
    String sValue = scanner.next(); //We can not retrive as float
    System.out.println(sValue + " is not a float");
}

System.console :

Java SE 6
String name = System.console().readLine("Please type your name and press Enter%n");

System.out.printf("Hello, %s!", name);

//To read passwords (without echoing as in unix terminal)
char[] password = System.console().readPassword();

Voordelen :

  • Leesmethoden zijn gesynchroniseerd
  • De tekenreekssyntaxis kan worden gebruikt

Opmerking : dit werkt alleen als het programma wordt uitgevoerd vanaf een echte opdrachtregel zonder de standaard invoer- en uitvoerstromen om te leiden. Het werkt niet wanneer het programma wordt uitgevoerd vanuit bepaalde IDE's, zoals Eclipse. Zie de andere voorbeelden voor code die werkt binnen IDE's en met stroomomleiding.

Basisopdrachtregelgedrag implementeren

Voor basisprototypes of basisopdrachtregelgedrag komt de volgende lus van pas.

public class ExampleCli {

    private static final String CLI_LINE   = "example-cli>"; //console like string

    private static final String CMD_QUIT   = "quit";    //string for exiting the program
    private static final String CMD_HELLO  = "hello";    //string for printing "Hello World!" on the screen
    private static final String CMD_ANSWER = "answer";    //string for printing 42 on the screen

    public static void main(String[] args) {
        ExampleCli claimCli = new ExampleCli();    // creates an object of this class

        try {
            claimCli.start();    //calls the start function to do the work like console
        }
        catch (IOException e) {
            e.printStackTrace();    //prints the exception log if it is failed to do get the user input or something like that
        }
    }

    private void start() throws IOException {
        String cmd = "";
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (!cmd.equals(CMD_QUIT)) {    // terminates console if user input is "quit"
            System.out.print(CLI_LINE);    //prints the console-like string 

            cmd = reader.readLine();    //takes input from user. user input should be started with "hello",  "answer" or "quit"
            String[] cmdArr = cmd.split(" ");

            if (cmdArr[0].equals(CMD_HELLO)) {    //executes when user input starts with "hello"
                hello(cmdArr);
            }
            else if (cmdArr[0].equals(CMD_ANSWER)) {    //executes when user input starts with "answer"
                answer(cmdArr);
            }
        }
    }
    
    // prints "Hello World!" on the screen if user input starts with "hello"
    private void hello(String[] cmdArr) {
        System.out.println("Hello World!");
    }
    
    // prints "42" on the screen if user input starts with "answer"
    private void answer(String[] cmdArr) {
        System.out.println("42");
    }
}

Tekenreeksen in console uitlijnen

De methode PrintWriter.format (opgeroepen via System.out.format ) kan worden gebruikt om uitgelijnde tekenreeksen in de console af te drukken. De methode ontvangt een String met de opmaakinformatie en een reeks te formatteren objecten:

String rowsStrings[] = new String[] {"1", 
                                     "1234", 
                                     "1234567", 
                                     "123456789"};

String column1Format = "%-3s";    // min 3 characters, left aligned
String column2Format = "%-5.8s";  // min 5 and max 8 characters, left aligned
String column3Format = "%6.6s";   // fixed size 6 characters, right aligned
String formatInfo = column1Format + " " + column2Format + " " + column3Format;

for(int i = 0; i < rowsStrings.length; i++) {
    System.out.format(formatInfo, rowsStrings[i], rowsStrings[i], rowsStrings[i]);
    System.out.println();
}

Output:

1   1          1
1234 1234    1234
1234567 1234567 123456
123456789 12345678 123456

Door gebruik te maken van opmaakstrings met een vast formaat, kunnen de strings worden afgedrukt in een tabelachtig uiterlijk met kolommen met een vast formaat:

String rowsStrings[] = new String[] {"1", 
                                     "1234", 
                                     "1234567", 
                                     "123456789"};

String column1Format = "%-3.3s";  // fixed size 3 characters, left aligned
String column2Format = "%-8.8s";  // fixed size 8 characters, left aligned
String column3Format = "%6.6s";   // fixed size 6 characters, right aligned
String formatInfo = column1Format + " " + column2Format + " " + column3Format;

for(int i = 0; i < rowsStrings.length; i++) {
    System.out.format(formatInfo, rowsStrings[i], rowsStrings[i], rowsStrings[i]);
    System.out.println();
}

Output:

1   1             1
123 1234       1234
123 1234567  123456
123 12345678 123456

Tekenreeksen opmaken

  • %s : alleen een string zonder opmaak
  • %5s : maak de string op met minimaal 5 tekens; als de tekenreeks korter is, wordt deze opgevuld tot 5 tekens en rechts uitgelijnd
  • %-5s : formatteer de string met minimaal 5 tekens; als de tekenreeks korter is, wordt deze opgevuld tot 5 tekens en links uitgelijnd
  • %5.10s : formatteer de string met minimaal 5 karakters en maximaal 10 karakters; als de tekenreeks korter is dan 5, wordt deze opgevuld tot 5 tekens en rechts uitgelijnd; als de tekenreeks langer is dan 10, wordt deze afgekapt tot 10 tekens en rechts uitgelijnd
  • %-5.5s : %-5.5s de string op met een vaste grootte van 5 tekens (minimum en maximum zijn gelijk); als de tekenreeks korter is dan 5, wordt deze opgevuld tot 5 tekens en links uitgelijnd; als de tekenreeks langer is dan 5, wordt deze afgekapt tot 5 tekens en links uitgelijnd


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow