Java Language
Console I / O
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
:
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
:
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