2016-02-22 5 views
0

У меня есть сервер Java, что это компиляция Android APK путем командной строки и Writting вывод в файл, это исходный код:input.readLine ждет (заблокирован) навсегда, как с этим бороться?

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(); 

Она работает идеально со всеми андроид проектов, но если андроида проект имеет каталог или файл с редкими символами (а, п ...) внутри папки активов, а затем, получить застрял в 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 [email protected] 
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 [email protected] 
java.io.InputStreamReader.read(InputStreamReader.java:184) 
java.io.BufferedReader.fill(BufferedReader.java:161) 
java.io.BufferedReader.readLine(BufferedReader.java:324) 
    - locked [email protected] 
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.

Благодаря

+0

Может кто-то помочь в этом? – NullPointerException

ответ

1

Во-первых, вы уверены, что вы хотите прочитать из p.getInputStream()? Gradle процесс будет писать в p.getOutputStream() или p.getErrorStream()

Во-вторых, я думаю, вы должны использовать tooling api для вызова Gradle вместо использования Runtime (см GradleConnector)

+0

Мне нужно сделать это без gradleconnector. Кстати, вы уверены в выходе? в документации входного потока я могу прочитать это: Возвращает входной поток, подключенный к нормальному выходу подпроцесса. Поток получает данные, поступающие из стандартного вывода процесса, представленного этим объектом Process. – NullPointerException

+0

Как получить выход градиента выходного потока? – NullPointerException

+0

это от ввода, проверьте это: http://stackoverflow.com/questions/16714127/how-to-redirect-process-builders-output-to-a-string – NullPointerException