使用rJava进行调用时,是否有办法在R中的字符向量中捕获Java写到控制台/ stdout的输出?有没有一种方法可以将Java的stdout重定向到文件并让R读取文件?
在我的特定用例中,我正在使用RJDBC连接到数据库,服务器将发送回有用的信息,并将其打印到控制台。我想解析这些消息,提取一些信息,并采取相应的措施。
当我执行运行Java代码的函数调用时,任何控制台输出都会中继到RStudio控制台,但是capture.output
似乎不起作用(我也尝试过type = "output"
)< / p>
rJava::.jinit()
jText <- capture.output(
rJava::J("java/lang/System")$out$println("Write this down"),
type = "message"
)
identical(jText, character(0))
#> [1] TRUE
我可以通过将java stdout重定向到文件来做到这一点,但是有什么方法可以避免写入文件?例如,我可以提取以这种方式与HAL 9000交谈的人:
rJava::.jinit()
jSys <- rJava::J("java/lang/System")
jOut <- tempfile(fileext = ".txt")
jOrigOut <- jSys$out
jPS <- rJava::.jnew("java/io/PrintStream", jOut)
jSys$setOut(jPS)
jSys$out$println("I'm sorry Dave. I'm afraid I can't do that")
jSys$setOut(jOrigOut)
msg <- readLines(jOut)
regmatches(msg, regexpr("(?<=I'm sorry ).*(?=\\.)", msg, perl = TRUE))
#> [1] "Dave"
由reprex package(v0.3.0)于2019-07-19创建
但是有办法避免使用临时文件吗?