Java Groovy:将标准输出重定向到文件无效

Java Groovy:将标准输出重定向到文件无效,java,redirect,groovy,stdout,Java,Redirect,Groovy,Stdout,我只是在学groovy。我有一个非常简单的脚本,它使用println将一些文本输出到STDERR和STDOUT: err = System.err resultStr = "test to print" err.println resultStr println resultStr 如果在不重定向的情况下运行脚本,则会在输出中获得两次resultStr字符串 如果我将输出重定向到带有test>test.txt的文件,结果字符串会在输出中出现一次(确定),test.txt会被创建(确定)

我只是在学groovy。我有一个非常简单的脚本,它使用
println
将一些文本输出到STDERR和STDOUT:

err = System.err    
resultStr = "test to print"
err.println resultStr
println resultStr
如果在不重定向的情况下运行脚本,则会在输出中获得两次
resultStr
字符串

如果我将输出重定向到带有
test>test.txt
的文件,结果字符串会在输出中出现一次(确定),test.txt会被创建(确定),但它为空。我试着做
System.out.println
而不是
println
,结果是一样的。我做错了什么

如果重要的话,我使用的是Windows7。以防万一,我试着重定向标准windows程序的输出,比如dir,它可以工作

Groovy版本:1.8.4 JVM:1.7.0\u 02

更新:我还尝试用java创建一个简单的类(相同的JVM)。重定向确实有效。所以它应该是Groovy中的东西

更新2:在@socha23评论他可以在Windows 7下从同一脚本成功重定向后,我认为问题不在于脚本,而在于Groovy安装、版本冲突或操作系统。所以我问了(很抱歉交叉发帖,但我真的认为这是一个边缘问题)

然后我发现,如果直接以
test.groovy>test.txt
的方式运行脚本,重定向将无法正常工作。但是如果我运行
groovytest.groovy>test.txt
,它就会工作。我仍然希望理解这种行为,并在可能的情况下予以纠正。请访问SU问题。至于今天12月24日,仍然没有答案


我想现在很清楚,这不是一个编程问题。请建议我是否从这里删除它。这两个问题都是相互关联的。

您的结果对我来说很有意义,标准“>”重定向只适用于标准输出。在bash和DOS中,我敢肯定,您都需要执行“2>”,以将标准错误输出重定向到文件。下面的脚本至少在bash上证明了这一点。DOS命令行对我的作用几乎相同

System.out.println "Hello Standard Out"
System.err.println "Hello Standard Err"

println "Hello plain-jane println"
简单重定向测试的stdout.txt显示“Hello Standard Out”和“Hello plain jane println”,但不显示“Hello Standard Err”,它出现在控制台上

bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout.txt
Hello Standard Err
bobk-mbp:hello bobk$
我的下一个测试显式重定向标准输出和标准错误,导致stdout2.txt显示“Hello standard out”和“Hello plain jane println”,stderr2.txt显示“Hello standard Err”


我很惊讶,在标准java中,您的结果会有任何不同,因为您尝试做的与VM无关,而与shell有很大关系。

您运行的是64位Windows 7吗?如果MS的此修补程序解决了您的问题,请尝试: 如果输出重定向不适用于某个程序,但控制台上的输出适用,则可能会应用此方法。(由于某些原因,修补程序没有安装在我的计算机上。)

据我所知,如果您直接调用groovy,则没有对CreateProcessWithTokenW的API调用,而如果您使用shell,即“test.groovy>file.txt”,它会调用此API函数,从而导致错误

更新:

同时我发现这个修补程序包含在Windows7SP1中,这就是为什么它不会安装在您和我的机器上。我发现的唯一其他相关bug是这个:,但据说它在Windows XP时代已经修复


我强烈怀疑Windows中的输出重定向代码仍然包含bug,因为我与您在使用不同的程序时遇到了相同的问题,可以通过更改源代码来解决,但方式没有意义。

如果在退出前刷新流,文件是否为空?@RogerLindsjöI put
System.out.flush()
在脚本的末尾,但文件仍然是空的。它在Mac OS X和Groovy 1.8.3上运行良好。我怀疑这与Windows7有关(尽管这令人惊讶)。好吧,我明天会尝试重新启动,看看会发生什么。有人可以在Windows计算机上尝试此代码吗?我正在使用最新的Groovy版本。我刚刚在Windows7机器上试用过,效果很好。这些链接很有用:请再次阅读问题。我对STDERR没有问题,我不想重定向它。问题是当我重定向STDOUT时,文件被创建,但它是空的,并且字符串(打印到STDOUT)没有出现在控制台中。stderr的字符串确实如预期的那样出现。实际上,我必须用一些新信息更新这个问题。问题似乎不是脚本的问题,而是操作系统的问题。请稍后再查。谢谢。我已经下载了修复程序,但它说我的操作系统不受支持。它是Windows 7 Pro 64位+SP1:(稍后再查。
bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout2.txt 2>stderr2.txt
bobk-mbp:hello bobk$