为什么访问Groovy进程的getText()两次导致失败?

时间:2016-02-04 18:44:54

标签: groovy gradle android-gradle

我正在使用Gradle任务运行一些curl代码,我注意到如果我两次访问进程的文本,那么第二次访问总是失败。我注意到通过将process.text传递给XlmSlurper()。如果我第一次打印出process.text它会在啜饮时崩溃,如果我没有打印它然后啜饮的工作。 这里有一些代码说明了这种行为。首先是失败的任务版本:

    task hello {
        println "****** HELLO ******"

        def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
        process.waitFor()

        println "err.text"
        println process.err.text

        println "process.text 1 is:"
        println process.text

        println "process.text 2 is:"
        println process.text
    }

执行此操作时,输出为:

****** HELLO ******
err.text
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   141    0    85  100    56   2412   1589 --:--:-- --:--:-- --:--:--  2428

process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121144</long>
process.text 2 is:
Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
java.lang.IllegalArgumentException: android.compileSdkVersion is missing!
    at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:80)
    at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.groovy:462)

但如果最后两条println行被注释掉,那么它就会成功:

    task hello {
        println "****** HELLO ******"

        def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
        process.waitFor()

        println "err.text"
        println process.err.text

        println "process.text 1 is:"
        println process.text

      //  println "process.text 2 is:"
      //  println process.text
    }

哪个有输出:

****** HELLO ******
err.text
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   141    0    85  100    56   1977   1303 --:--:-- --:--:-- --:--:--  2023

process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121145</long>
:help

Welcome to Gradle 2.2.1.

To run a build, run gradlew <task> ...

To see a list of available tasks, run gradlew tasks

To see a list of command-line options, run gradlew --help

BUILD SUCCESSFUL

为什么添加/删除那些最后的printlns造成了这样的差异?

(还有为什么:在第二个版本的输出中有帮助......)

在这两种情况下,我都是使用./gradlew

从命令行运行

如果使用getText()而不是text /

,则会出现同样的问题

2 个答案:

答案 0 :(得分:2)

此功能的文档说:

  

public static String getText(Process self)抛出IOException

     

阅读Process的输出流文本。关闭所有   检索文本后与流程关联的流。

读取标准输出直到EOF,然后作为String返回。该值未缓存,第二次调用到达封闭流,并失败。

此外,在groovy中,process.getText()相当于process.text

答案 1 :(得分:1)

您将获得一个只能读取一次的流。将其写入文件或变量&amp;然后根据需要从该文件/变量中多次读取它。