java。io.控制台支持在日食IDE
题
我利用日食IDE发展、编纂和运行我Java项目。今天,我在使用 java.io.Console
一流的管理产出,更重要的是,用户输入。
问题是, System.console()
返回 null
当一个应用程序运行"通过"食。日食运行程序的背景下处理,而不是一个顶级的过程与控制台窗口,我们是熟悉的。
有没有办法生效日食运行程序作为一个顶级的过程,或至少建立一个控制台,JVM会认识?否则,我被迫罐子的项目和运行上的命令行环境外部蚀。
解决方案
我假定你们想要能够使用的步骤,通过调试从蚀。你可以运行类外部通过设置课站上的目录java运行环境类路径。
java -cp workspace\p1\bin;workspace\p2\bin foo.Main
你可以试使用遥调试和利用这类文件建立在你的项目。
在这个例子中,日食项目的结构看起来是这样的:
workspace\project\
\.classpath
\.project
\debug.bat
\bin\Main.class
\src\Main.java
1.开始JVM控制台在调试模式
调试。蝙蝠 是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.的 暂停=y 参告诉JVM要等到调试器,高度重视.
2.创建一个调试启动配置
在日食开调试对话(运行>开放式对话调试...)并创建一个新的 远程Java应用程序 配置下列设置:
- 项目: 项目名称
- 连接类型: 标准(Socket附加)
- 主持人: "localhost"
- 港口: 8787
3.调试
因此,所有你需要做任何你想要的时间来调试的应用程序是:
- 设置一个突破点
- 启动批文件中的控制台
- 启动配置调试
其他提示
我使用的解决方法是在使用Eclipse时使用System.in/System.out而不是Console。例如,而不是:
String line = System.console().readLine();
您可以使用:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();
之所以发生这种情况,是因为eclipse将您的应用程序作为后台进程运行,而不是作为使用系统控制台的顶级进程运行。
您可以自己实施课程。以下是一个例子:
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);
}
}
在 http://www.stupidjavatricks.com/?p=43 <找到相关内容/ a>。
可悲的是,由于控制台是最终的,你无法扩展它以创建一个围绕system.in和system.out的包装器。即使在eclipse控制台内,你仍然可以访问它们。这可能就是为什么eclipse还没有将它插入到他们的控制台中......
我明白为什么你不希望有任何其他方法来获得除System.console以外的控制台,没有setter,但我不明白为什么你不希望别人能够覆盖这个类制作模拟/测试控制台...
另一个选择是创建一个方法来包装两个选项,并“故障转移”。当Console不可用时,使用System.in方法。下面的示例是一个相当基本的示例 - 您可以按照相同的过程来根据需要将其他方法包装在Console(readPassword,format)中。这样你就可以在Eclipse&amp;中快乐地运行它。部署后,您将获得控制台功能(例如密码隐藏)。
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;
}
据我所知,没有办法从Eclipse获取Console对象。我只是确保控制台!= null,然后JAR它并从命令行运行它。
在通过Eclipse运行应用程序时似乎无法获取java.io.Console对象。命令行控制台窗口不会随应用程序打开,因为它作为后台进程运行(Eclipse的背景?)。目前,没有Eclipse插件来处理这个问题,主要是因为java.io.Console是最后一个类。
您真正要做的就是测试返回的Console对象是否为null,然后从那里继续。
链接提供使用System.console()的替代方法。一种是使用围绕System.in的BufferedReader,第二种是使用围绕System.in的Scanner。
既不像控制台一样简洁,但两者都可以在eclipse中工作,而不必诉诸调试愚蠢!
假设您的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”