试图用Java从控制台读取

时间:2014-10-20 16:57:53

标签: java intellij-idea

我刚开始使用IntelliJ IDE学习Java。我知道有点C#所以逻辑是有道理的,但到目前为止有一件事我无法克服它。

如何从控制台读取?在C#中,您可以使用Console.ReadLine()轻松阅读人类输入的内容。在Java中,System.console().readLine();对我不起作用并抛出NullPointerException

我在这里缺少什么?

4 个答案:

答案 0 :(得分:61)

问题

大多数IDE使用javaw.exe而不是java.exe来运行Java代码(请参见下图)。

这两个程序之间的区别在于javaw运行Java代码而不与当前终端/控制台(这对GUI应用程序有用),并且因为没有关联的控制台窗口{ {1}}返回System.console()。因为null最终为System.console().readLine()而导致null.readLine(),因为NullPointerException没有null方法(也没有任何方法/字段)。

但仅仅因为没有关联的控制台,这并不意味着我们无法与readLine()进程通信。此过程仍然支持标准输入/输出/错误流,因此IDE处理(以及我们也通过它)可以通过javawSystem.inSystem.out使用它们。

这样IDE可以有一些标签/窗口,让它模拟控制台。

例如,当我们运行Eclipse中的代码时:

System.err

我们将看到结果

enter image description here

表明尽管package com.stackoverflow; public class Demo { public static void main(String[] args) throws Exception { System.out.println("hello world"); System.out.println(System.console()); } } 没有关联的控制台(最后为javaw.exe),IDE仍能够处理来自null进程javaw的标准输出的数据并显示System.out.println("hello world");

一般解决方案

让用户传递信息以处理使用标准输入流(hello world)。但由于System.in很简单inInputStream s用于处理二进制数据,因此它没有方法可以让它轻松正确地读取数据文本(特别是如果可以涉及编码)。这就是为StreamReaders添加到Java的原因。

因此,为了让生活更轻松,让应用程序从用户那里读取数据作为文本,您可以将此流包装在Writers之类的Reader中,这样您就可以使用BufferedReader读取整行} 方法。不幸的是,这个类不接受readLine()而是Streams,因此我们需要某种适配器来模拟Reader并能够将字节翻译成文本。但这就是Reader存在的原因。

因此,允许应用程序从输入流中读取数据的代码看起来像

InputStreamReader

首选/最简单的解决方案 - 扫描仪

为了避免将 magic 转换为允许将Stream转换为Reader,您可以使用BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Hello. Please write your name: "); String name = br.readLine(); System.out.println("Your name is: "+name); 类,这意味着将数据作为文本从Streams和Readers中读取。

这意味着你可以简单地使用

Scanner

从用户读取数据(将由IDE使用标准输入流模拟的控制台发送)。

答案 1 :(得分:1)

java.util.Scanner您正在寻找API。

答案 2 :(得分:0)

如果你真的需要Console对象,你可以从命令行编译你的类。首先在我的java文件中,第一个语句是package com.inputOutput;

转到项目“src”文件夹并将其编译为:“javac com/inputOutput/Password.java”“com”和“inputOutput”是文件夹(包)。在src文件夹中运行您的班级文件 java com.inputOutput.Password“。它为我工作了。

答案 3 :(得分:0)

您可以使用Jframe。

JFrame frame = new JFrame("titile");

// prompt the user to enter their code
String code = JOptionPane.showInputDialog(frame, "promt here");