Eclipse IDE中的java.io.Console支持

时间:2020-03-06 14:27:12  来源:igfitidea点击:

我使用Eclipse IDE来开发,编译和运行Java项目。今天,我正在尝试使用java.io.Console类来管理输出,更重要的是,管理用户输入。

问题在于,当"通过" Eclipse运行应用程序时," System.console()"返回" null"。 Eclipse在后台进程上运行该程序,而不是在我们熟悉的控制台窗口中的顶级进程上运行。

有没有一种方法可以强制Eclipse将程序作为顶级进程运行,或者至少创建JVM将识别的控制台?否则,我被迫将项目压缩并在Eclipse外部的命令行环境中运行。

解决方案

据我所知,没有办法从Eclipse获取Console对象。我只是要确保控制台!= null,然后将其JAR起来并从命令行运行它。

发生这种情况的原因是因为eclipse将应用程序作为后台进程而不是系统控制台的顶级进程来运行。

在http://www.stupidjavatricks.com/?p=43找到了有关此内容的信息。

遗憾的是,由于控制台是最终版本,因此我们无法对其进行扩展以在system.in和system.out周围创建包装器。即使在eclipse控制台内部,我们仍然可以访问它们。这可能就是为什么eclipse尚未将其插入其控制台的原因...

我理解为什么我们除了System.console之外,没有其他方法,不想用其他任何方式来获得控制台,但是我不明白为什么我们不希望有人能够重写该类来制作控制台模拟/测试控制台...

通过Eclipse运行应用程序时,似乎无法获取java.io.Console对象。命令行控制台窗口未随应用程序一起打开,因为它是作为后台进程(Eclipse的背景吗?)运行的。当前,没有Eclipse插件可以处理此问题,主要是因为java.io.Console是最终类。

我们真正能做的就是测试返回的Console对象是否为null,然后从那里继续。

我假设我们希望能够使用Eclipse的逐步调试。我们可以通过在JRE类路径的bin目录中设置构建的类来在外部运行这些类。

java -cp workspace\p1\bin;workspace\p2\bin foo.Main

我们可以使用远程调试器进行调试,并利用项目中内置的类文件。

在此示例中,Eclipse项目结构如下所示:

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java

1.在调试模式下启动JVM控制台

debug.bat是Windows批处理文件,应从cmd.exe控制台在外部运行。

@ECHO OFF
SET A_PORT=8787
SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y
java.exe %A_DBG% -cp .\bin Main

在参数中,调试端口已设置为8787. suspend= y参数告诉JVM等待直到添加调试器。

2.创建调试启动配置

在Eclipse中,打开"调试"对话框(运行>打开调试对话框...),并使用以下设置创建新的远程Java应用程序配置:

  • 项目:项目名称
  • 连接类型:标准(插座连接)
  • 主机:本地主机
  • 港口:8787

3.调试

因此,我们想要调试该应用程序的所有时间是:

  • 设定一个断点
  • 在控制台中启动批处理文件
  • 启动调试配置

我们可以在错误122429中跟踪此问题。我们可以通过使用此处描述的抽象层在应用程序中解决此问题。

我使用的解决方法是在使用Eclipse时仅使用System.in/System.out而不是Console。例如,代替:

String line = System.console().readLine();

我们可以使用:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();