2012-03-13 85 views
12

我正在开发与Netbeans和Maven的应用程序。我的应用程序应该从stdin获取数据。但我无法理解如何测试它。将< data.txt放入参数列表不起作用。有没有办法在Netbeans中将输入从文件重定向到stdin?

我需要一样:

$ java MyProgram < data.txt 
+0

为什么你使用stdin作为输入,而不是简单的访问文件的参数? – khmarbaise 2012-03-13 14:43:16

+0

@khmarbaise写入/读取父/子进程的速度更快,而不是:打开文件/写入文件/关闭文件/运行进程/打开文件/从文件/关闭文件读取。在我的场景中,我不依赖于文件系统的性能,而且我可以在父进程正在写入的情况下从流中读取数据。 – denys 2012-03-14 14:25:05

回答

6

这可以通过将您自己的运行目标添加到项目的build.xml文件来完成。例如:

<target name="run" depends="jar"> 
    <exec dir="${work.dir}" executable="java" input="${work.dir}/inputfile.txt"> 
    <arg value="-jar"/> 
    <arg file="${dist.jar}"/> 
    </exec> 
</target> 

请注意,命令如运行,调试和测试仅使用自定义的build.xml如果在保存时编译时关闭了该项目。因此,您需要确保项目属性中的“保存时编译”功能处于关闭状态。

+0

工作,我不知道为什么在Save''编译必须被关闭,以得到这个工作? – 2013-08-08 15:51:50

10

我假设你有一个像一件事:

public static void main(String[] args) { 
... 
} 

这可以作为一个切入点,以您的应用程序使用,更改输入通道之前通过:

FileInputStream is = new FileInputStream(new File("test.data")); 
System.setIn(is); 

以上可以一个单元/集成测试中使用。

+0

与@ZeroTau解决方案相比,这样做更方便 – 2013-08-08 15:40:05

+0

但它会改变我害怕的代码的功能 - 即运行结果程序将从'test.data'文件读取输入,而不是标准输入流。 – 2013-08-08 15:41:08

1

我不知道它是如何在NetBeans中,但在Eclipse中,你可以写一些东西到控制台,它被重定向为STDIN运行的应用程序。我相信在NetBeans中也应该可以工作。因此,只需运行您的应用程序,然后将data.txt的内容复制/粘贴到控制台,并可能按<ENTER>

如果没有帮助,使用远程调试,即从运行命令提示符程序如下:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y MyProgram < data.txt

然后连接到从NetBeans中这一过程。

+0

你是那个了解我的问题的人。但不幸的是这样的外壳STRIG不Netbeans的:( – denys 2012-07-30 11:33:11

1

旧学校,但这是我所知道的。需要注意的是,mvn命令完成后不会返回到cli,但出于某种目的,这是可以接受的。注意:您需要在项目的根目录

MVN “-Dexec.args = -classpath%CLASSPATH com.mycompany.test” -Dexec.executable = /下载/ jdk1.7 /斌/ java的EXEC-maven-插件:1.2.1:exec </tmp /输入

0

使用以下文本在Files-> build.xml下添加一个新的目标“run-input”。注意:这个版本使用了java运行库的正确位置。此外,它假定您已经使用文件input1创建了一个名为inputs的目录。

<target name="run-input" depends="jar"> 
    <exec dir="${work.dir}" executable="${java.home}/bin/java" input="${src.dir}/inputs/input1"> 
    <arg value="-jar"/> 
    <arg file="${dist.jar}"/> 
    </exec> 
</target> 

您可以随时为此新目标创建快捷方式。

相关问题