input.readLine永远等待(阻止),¿如何处理这个问题?

时间:2016-02-22 12:49:34

标签: android gradle inputstream bufferedreader readline

我有一个java服务器,它通过命令行编译android APK,并将输出写入文件,这是源代码:

Process p = Runtime.getRuntime().exec("gradlew assembleRelease", null , new File(this.workDir));            
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;     
        while ((line = input.readLine()) != null) {
            standardOutput.writeln(line);
        }
        input.close();

它与所有的android项目都很完美,但是如果android项目在assets文件夹中有一个目录或者包含罕见字符(á,ñ...)的文件,那么,就会陷入line = input.readLine()

我打开了jconsole以查看卡在哪里,我得到了这个:

Name: Thread-3
State: RUNNABLE
Total blocked: 0  Total waited: 6
Stack trace: 
java.io.FileInputStream.readBytes(Native Method)
java.io.FileInputStream.read(FileInputStream.java:255)
java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
java.io.BufferedInputStream.read(BufferedInputStream.java:345)
   - locked java.io.BufferedInputStream@e70e4f8
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
   - locked java.io.InputStreamReader@4426351b
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:161)
java.io.BufferedReader.readLine(BufferedReader.java:324)
   - locked java.io.InputStreamReader@4426351b
java.io.BufferedReader.readLine(BufferedReader.java:389)
com.mobinGen.jobs.AndroidJob.releaseCompile(AndroidJob.java:329)
com.mobinGen.jobs.AndroidJob.jobProcess(AndroidJob.java:122)
com.mobinGen.jobs.BaseJob.process(BaseJob.java:138)
com.mobinGen.generationAPI.GeneratorAndroid$AndroidJobsAsker.run(GeneratorAndroid.java:230)

正如您所看到的,它在第329行被屏蔽,即while ((line = input.readLine()) != null)

我该如何处理?这是一个很大的问题,因为服务器正在等待,而不会编译下一个即将发布的android项目。

由于

2 个答案:

答案 0 :(得分:1)

首先,您确定要阅读p.getInputStream()吗? Gradle流程将写入p.getOutputStream()p.getErrorStream()

其次,我认为您应该使用tooling api来调用gradle,而不是使用Runtime(请参阅GradleConnector

答案 1 :(得分:0)

也许您想在InputStreamReader中使用显式字符集。

请参阅InputStreamReader(InputStream in, Charset cs)