【问题标题】:input.readLine waiting (blocked) for ever, how to deal with this?input.readLine 永远等待(阻塞),¿如何处理?
【发布时间】:2016-06-03 21:50:34
【问题描述】:

我有一个 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 项目。

谢谢

【问题讨论】:

  • 有人可以帮忙吗?

标签: android gradle inputstream bufferedreader readline


【解决方案1】:

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

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

【讨论】:

  • 我需要在没有 gradleconnector 的情况下执行此操作。顺便说一句,您确定输出流吗?在输入流的文档中我可以读到:返回连接到子进程正常输出的输入流。流从这个 Process 对象表示的进程的标准输出中获取数据。
  • 如何从 outputstream 中获取 gradle 输出?
【解决方案2】:

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

InputStreamReader(InputStream in, Charset cs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多