eclipse java.io_Eclipse IDE中的java.io.Console支持

Eclipse IDE中的java.io.Console支持

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

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

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

10个解决方案

50 votes

我假设您希望能够使用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应用程序配置:

项目:您的项目名称

连接类型:标准(插座连接)

主持人:localhost

港口:8787

3.调试

因此,您想要调试应用程序时所需要做的就是:

设定一个断点

在控制台中启动批处理文件

启动调试配置

您可以在错误122429中跟踪此问题。您可以使用此处所述的抽象层在您的应用程序中解决此问题。

McDowell answered 2019-07-19T14:12:32Z

35 votes

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

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

您可以使用:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

String line = bufferedReader.readLine();

Laplie Anderson answered 2019-07-19T14:13:00Z

5 votes

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

Heath Borders answered 2019-07-19T14:13:25Z

5 votes

你可以自己实现一个类。 以下是一个例子:

public class Console {

BufferedReader br;

PrintStream ps;

public Console(){

br = new BufferedReader(new InputStreamReader(System.in));

ps = System.out;

}

public String readLine(String out){

ps.format(out);

try{

return br.readLine();

}catch(IOException e)

{

return null;

}

}

public PrintStream format(String format, Object...objects){

return ps.format(format, objects);

}

}

yztaoj answered 2019-07-19T14:13:50Z

4 votes

在[http://www.stupidjavatricks.com/?p=43]上找到了一些相关信息。

遗憾的是,由于控制台是最终的,你无法扩展它以创建一个围绕system.in和system.out的包装器。 即使在eclipse控制台内,你仍然可以访问它们。 这可能是为什么eclipse还没有将它插入到他们的控制台中...

我明白为什么你不想有任何其他方法来获得除System.console以外的控制台,没有setter,但我不明白为什么你不希望有人能够覆盖类来制作一个 模拟/测试控制台......

John Gardner answered 2019-07-19T14:14:34Z

4 votes

另一种选择是创建一个方法来包装两个选项,并在Console不可用时“故障转移”到System.in方法。 下面的示例是一个相当基本的示例 - 您可以按照相同的过程来根据需要将其他方法包装在Console(readPassword,format)中。 这样你就可以在Eclipse&中快乐地运行它。 当它部署时,您将获得控制台功能(例如密码隐藏)。

private static String readLine(String prompt) {

String line = null;

Console c = System.console();

if (c != null) {

line = c.readLine(prompt);

} else {

System.out.print(prompt);

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

try {

line = bufferedReader.readLine();

} catch (IOException e) {

//Ignore

}

}

return line;

}

binarycube answered 2019-07-19T14:14:59Z

2 votes

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

perimosocordiae answered 2019-07-19T14:15:26Z

1 votes

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

你所能做的就是测试返回的Console对象为null并从那里继续。

Ross answered 2019-07-19T14:16:02Z

1 votes

此链接提供了使用System.console()的替代方法。 一种是使用围绕System.in的BufferedReader,第二种是使用围绕System.in的Scanner。

既不像控制台一样简洁,但两者都可以在eclipse中工作,而不必诉诸调试愚蠢!

DaveRlz answered 2019-07-19T14:16:35Z

0 votes

假设你的Eclipse工作区是C:\ MyWorkspace,你在maven项目MyProject中创建了你的java应用程序,并且您的Java主类是com.mydomain.mypackage.MyClass。

在这种情况下,您可以在命令行上运行使用System.console()的主类:

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass

NB1:如果它不在maven项目中,请检查项目属性中的输出文件夹 Java构建路径| 资源。 它可能不是“目标/类”

NB2:如果它是一个maven项目,但是你的类在src / test / java中,你可能不得不使用“target \ test-classes”而不是“target \ classes”

Paulo Merson answered 2019-07-19T14:17:26Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值