Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JRuby:将stdout重定向到StringWriter会产生空输出_Java_Ruby_Jruby - Fatal编程技术网

Java JRuby:将stdout重定向到StringWriter会产生空输出

Java JRuby:将stdout重定向到StringWriter会产生空输出,java,ruby,jruby,Java,Ruby,Jruby,我正在使用JRuby从Java程序中动态运行Ruby脚本。脚本使用ARGV和包含称为ctx的附加信息的对象接收参数。然后,他们对信息做一些处理,并将结果返回给stdout,或者,如果出现问题,则向stderr返回一条错误消息。这是我用来执行ruby脚本的代码: String script=Joiner.on'\n'.joinFiles.readAllLinesPaths.getpath,StandardCharsets.UTF_8;//从中读取文件 script=需要“rubygems”\n+s

我正在使用JRuby从Java程序中动态运行Ruby脚本。脚本使用ARGV和包含称为ctx的附加信息的对象接收参数。然后,他们对信息做一些处理,并将结果返回给stdout,或者,如果出现问题,则向stderr返回一条错误消息。这是我用来执行ruby脚本的代码:

String script=Joiner.on'\n'.joinFiles.readAllLinesPaths.getpath,StandardCharsets.UTF_8;//从中读取文件 script=需要“rubygems”\n+script;//使宝石起作用 ScriptingContainer rb=新ScriptingContainerLocalVariableBehavior.PERSISTENT; rb.setcompativersioncompatversion.RUBY1_9; 字符串cwd=path.get.toabsolutionPath.toString; rb.setCurrentDirectorycwd;//将脚本的工作目录设置为应用程序的工作目录 StringWriter out=新的StringWriter; PrintWriter pwOut=新的PrintWriter输出; StringWriter错误=新StringWriter; PrintWriter pwErr=新的PrintWritererr; 字符串[]argsAry=args.split; rb.setOutputpwOut; rb.setErrorpwErr; rb.setArgvargsAry;//设置输出写入程序、错误写入程序和argv rb.putctx,ctx;//将ctx添加到脚本容器 试一试{ rb.runScriptletscript; }捕集器{ logger.ErrorJRuby执行期间发生异常!ctx id=+ ctx.getId+,t; } 关上; err.close;//亲密作家 System.out.printlnout.getBuffer;//用于调试目的 System.err.printlnerr.getBuffer;//将stderr结果打印到stderr, return out.getBuffer.toString;//并返回标准输出结果 这是我用于测试的ruby脚本:

text=ARGV*“” 放置文本 现在我的问题是,在执行ruby脚本之后,两个缓冲区都是完全空的。我在stdout/err中只得到两行空行,没有返回任何内容。使用另一个脚本,我确保脚本确实运行,并且ctx成功地传递给脚本

我已经尝试过的事情:

使用ctx中的变量将结果传递给java程序,使用rb.get检索结果-尝试访问ctx的NullPointerException 在ctx内部使用变量而不使用rb.get-变量为空 在脚本中设置字符串以将其传递给程序,在尝试访问字符串时使用rb.get-NPE 根本不使用缓冲区-不会将任何内容写入标准输出/err 只使用StringWriter,而不是将其与PrintWriter结合使用-没有变化,但建议我这样做 使用另一个compat版本初始化容器-无更改 使用不同的LocalVariableBehavior-无更改 使用rb.setWriter/rb.setErrorWriter而不是rb.setOutput/rb.setError-无更改
任何帮助都将不胜感激。

经过一些实验,我成功地解决了这个问题,在构造函数中将rb的LocalContextScope设置为THREADSAFE,并在执行后刷新所有四个写入程序