Eclipse IDE中的java.io.Console支持

时间:2008-09-19 18:19:31

标签: java eclipse console java-io

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

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

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

10 个答案:

答案 0 :(得分:50)

我假设您希望能够使用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中,打开“调试”对话框(“运行”&gt;“打开调试对话框...”)并使用以下设置创建新的远程Java应用程序配置:

  • 项目:您的项目名称
  • 连接类型:标准(套接字连接)
  • 主持人: localhost
  • 端口: 8787

第3。调试

因此,您想要调试应用程序的所有时间都是:

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

您可以在bug 122429中跟踪此问题。您可以使用描述为here的抽象层来解决此问题。

答案 1 :(得分:35)

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

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

您可以使用:

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

您可以自己实施课程。以下是一个例子:

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);
    }
}

答案 4 :(得分:4)

http://www.stupidjavatricks.com/?p=43找到了相关信息。

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

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

答案 5 :(得分:4)

另一种选择是创建一个方法来包装这两个选项,并在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;
    }

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

假设您的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”