Java:如何从System.console()获取input

我正在尝试使用控制台类来从用户input,但是当我调用System.console()时返回一个空对象。 在使用System.console之前,我必须改变什么吗?

 Console co=System.console(); System.out.println(co); try{ String s=co.readLine(); } 

使用控制台读取input(仅在IDE外部使用):

 System.out.print("Enter something:"); String input = System.console().readLine(); 

另一种方式(无处不在):

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter String"); String s = br.readLine(); System.out.print("Enter Integer:"); try{ int i = Integer.parseInt(br.readLine()); }catch(NumberFormatException nfe){ System.err.println("Invalid Format!"); } } } 

System.console()在IDE中返回null
所以如果你真的需要使用System.console(),请阅读McDowell的这个解决scheme 。

 Scanner in = new Scanner(System.in); int i = in.nextInt(); String s = in.next(); 

从控制台/键盘读取inputstring的方法很less。 以下示例代码显示了如何使用Java从控制台/键盘读取string。

 public class ConsoleReadingDemo { public static void main(String[] args) { // ==== BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Please enter user name : "); String username = null; try { username = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } System.out.println("You entered : " + username); // ===== In Java 5, Java.util,Scanner is used for this purpose. Scanner in = new Scanner(System.in); System.out.print("Please enter user name : "); username = in.nextLine(); System.out.println("You entered : " + username); // ====== Java 6 Console console = System.console(); username = console.readLine("Please enter user name : "); System.out.println("You entered : " + username); } } 

代码的最后一部分使用了java.io.Console类。 当通过Eclipse运行演示代码时,无法从System.console()获取Console实例。 由于eclipse将您的应用程序作为后台进程运行,而不是作为系统控制台的顶层进程运行。

这将取决于你的环境。 如果您通过javaw运行Swing UI,则不会显示控制台。 如果您在IDE中运行,它将非常依赖于特定的IDE对控制台IO的处理。

从命令行来看,应该没问题。 样品:

 import java.io.Console; public class Test { public static void main(String[] args) throws Exception { Console console = System.console(); if (console == null) { System.out.println("Unable to fetch console"); return; } String line = console.readLine(); console.printf("I saw this line: %s", line); } } 

java运行这个:

 > javac Test.java > java Test Foo <---- entered by the user I saw this line: Foo <---- program output 

另一个select是使用System.in ,您可能想要将其包装在BufferedReader以读取行,或使用Scanner (再次包装System.in )。

在这里find一些关于从控制台读取的好的答案,这里另一种方式使用“扫描仪”从控制台读取:

 import java.util.Scanner; String data; Scanner scanInput = new Scanner(System.in); data= scanInput.nextLine(); scanInput.close(); System.out.println(data); 

以下采取athspk的答案,并使其成为一个不断循环,直到用户键入“退出”。 我也写了一个后续的答案 ,我已经采取了这个代码,并使其可testing。

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class LoopingConsoleInputExample { public static final String EXIT_COMMAND = "exit"; public static void main(final String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter some text, or '" + EXIT_COMMAND + "' to quit"); while (true) { System.out.print("> "); String input = br.readLine(); System.out.println(input); if (input.length() == EXIT_COMMAND.length() && input.toLowerCase().equals(EXIT_COMMAND)) { System.out.println("Exiting."); return; } System.out.println("...response goes here..."); } } } 

示例输出:

 Enter some text, or 'exit' to quit > one one ...response goes here... > two two ...response goes here... > three three ...response goes here... > exit exit Exiting. 

尝试这个。 希望这会有所帮助。

  String cls0; String cls1; Scanner in = new Scanner(System.in); System.out.println("Enter a string"); cls0 = in.nextLine(); System.out.println("Enter a string"); cls1 = in.nextLine(); 

我编写了Text-IO库,它可以处理在IDE内运行应用程序时System.console()为null的问题。

它引入了一个类似McDowell提出的抽象层。 如果System.console()返回null,则该库将切换到基于Swing的控制台。

另外,Text-IO还有一系列有用的function:

  • 支持各种数据types的读取值。
  • 允许在读取敏感数据时屏蔽input。
  • 允许从列表中select一个值。
  • 允许指定input值的限制(格式模式,数值范围,长度限制等)。

用法示例:

 TextIO textIO = TextIoFactory.getTextIO(); String user = textIO.newStringInputReader() .withDefaultValue("admin") .read("Username"); String password = textIO.newStringInputReader() .withMinLength(6) .withInputMasking(true) .read("Password"); int age = textIO.newIntInputReader() .withMinVal(13) .read("Age"); Month month = textIO.newEnumInputReader(Month.class) .read("What month were you born in?"); textIO.getTextTerminal().println("User " + user + " is " + age + " years old, " + "was born in " + month + " and has the password " + password + "."); 

在这个图像中,您可以看到上面的代码在基于Swing的控制台中运行。