2016-02-04 58 views
0

我正在用Gradle任务运行一些curl代码,并且我注意到如果我访问两次进程的文本,那么第二次访问总是失败。我注意到通过将process.text传递给XlmSlurper()。如果我第一次打印process.text,它会在sl crash中崩溃,如果我没有打印它,那么唾液就会起作用。 下面是一些说明这种行为的代码。首先是任务的版本失败:为什么访问Groovy进程的getText()两次会导致失败?

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()代替文本/

回答

1

您正在获取只能读取一次的流。将它写出到一个文件或变量&然后根据你想从该文件/变量中多次读取它。

2

这个函数的文档说:

公共静态字符串gettext的(过程个体经营)抛出IOException异常

读取进程的输出流的文本。检索文本后,关闭与该进程关联的所有 流。

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

此外,在常规,process.getText()相当于process.text

相关问题