Java + Eclipse:如何调试接收管道/重定向stdin的java程序?

时间:2009-10-16 22:38:40

标签: java eclipse stdin

我正在使用Eclipse开发一个Java程序,并且我想在我的程序中添加一个选项来解析stdin,如果没有参数的话。 (否则它解析文件)

如果我执行"somecommand | java -jar myjar.jar"并进行调试,我遇到了问题...然后意识到我不知道如何在Eclipse中启动一个进程。如果我在命令提示符下运行它,我就无法附加到正在运行的进程,因为该进程会立即启动。

有关如何调试的任何建议吗?

编辑:看,事情是,我最初编写了我的程序来获取文件名参数。然后我认为它也很有用,也可以使用stdin,所以我做了从我的程序中抽象出InputStream(正如Queue先生建议的那样)。它可以在文件(java -jar myjar.jar myfile)上正常运行,但在运行type myfile | java -jar myjar.jar时无法运行。我怀疑这两种情况有什么不同(eof检测不同?)但我真的想调试。

// overall program structure follows:

public static void doit(InputStream is)
{
    ...
}

public static void main(String[] args)
{
    if (args.length > 0)
    {
        // this leaves out the try-catch-finally block,
        // but you get the idea. 
        FileInputStream fis = new FileInputStream(args[0]);
        doit(fis);
        fis.close();
    }
    else
    {
        doit(System.in);
    }
}

4 个答案:

答案 0 :(得分:11)

使用管道在命令行上运行您的应用程序,但添加JVM args以进行远程调试,如下所示:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044

suspend=y将告诉JVM在连接调试器之前不会实际运行程序。

接下来,进入Eclipse调试启动配置(Run -> Debug Configurations...)并创建一个“远程Java应用程序”以连接到您的应用程序。在Eclipse中运行启动(在设置一些断点之后),您应该能够进行调试。不是非常方便,但如果你不能在没有管道的情况下重现你的问题,这是一个选择。

答案 1 :(得分:4)

如果我正确地解释你的问题,我相信你只想知道如何在标准输入中输入输入并在eclipse中通过它进行调试。

如果是简单输入,您可以在程序运行时通过eclipse控制台窗口手动输入System.in数据。只需在控制台窗口中输入,然后按Enter键将文本发送到Standard in。

如果它更复杂,我建议抽象你想要做的读取来获取InputStream。在您的程序中,您可以将System.in作为InputStream发送。要调试,您可以发送任何其他InputStream。例如,您可以将输入放在一个文件中,并将FileInputStream传递给方法进行测试。

编辑: 没有看到更多的代码,我不确定,但你可能正在使用eof检测。 FileInputStream有一个已定义的文件结尾,但我猜System.in没有任何类型。您的读者可能只是在等待阅读下一个角色而从未前进过。您可能必须在知道已阅读“足够”后手动停止阅读。

答案 2 :(得分:0)

创建命名管道this solution可能适用于此处。

mkfifo foo
somecommand > foo

接下来在调试配置中,在args中添加< foo,以便将程序调试为:

  

java -jar myjar.jar&lt; FOO

答案 3 :(得分:0)

我迟到了。但是您可以在项目的调试配置中查找“公共”选项卡。在那里,您应该能够看到标有“标准输入和输出”的部分。您可以为控制台分配输入文件,并以这种方式设置输出文件。