Java IO 相关 Process 执行命令获取输出 输出很大该怎么读取?

2022-11-09 09:47:43 +08:00
 gzk329

例如:

读 InputStream 标准输出流,输出流东西很多
发现正常读取的时候 process 已经退出了
process.waitFor()方法 等待会导致缓冲区被填满,然后阻塞
思路是在 waitFor()前,异步地去读取输出流中的内容
但是不生效

简单代码 我写一块儿了 缩进比较恶心 主要是有什么好的解决思路吗?

Process process;
try {
            process = runtime.exec(commands);
            ThreadPools.LOG_COLLECT.execute(()->{
            try (InputStream in = process.getInputStream();
             BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
            String line;
            File destfile = new File(...);
            while ((line = br.readLine()) != null) {
                FileUtils.writeStringToFile(destfile, line + "\n", StandardCharsets.UTF_8, true);
            }
            } catch (IOException e) {
              //exception handler
            }
            });
            process.waitFor();
} catch (IOException | InterruptedException e) {
    //exception handler
}
2291 次点击
所在节点    程序员
27 条回复
aguesuka
2022-11-09 13:52:27 +08:00
@aguesuka 看错了, bash -c 确实不用
xboxv
2022-11-09 13:57:35 +08:00
@gzk329 命令应该没什么问题, 进程的输出有可能在错误流,process.getInputStream();改为 getErrorStream 试试
aguesuka
2022-11-09 14:01:15 +08:00
sleep 三秒就正常的话, 感觉这段代码是能运行的, 而是执行的时机不对
xboxv
2022-11-09 14:13:44 +08:00
@aguesuka 什么代码要 sleep 三秒?代码贴一下
quicksand
2022-11-09 15:11:44 +08:00
我试了你的代码,读取一个 60M 的文本没任何异常
gzk329
2022-11-09 15:27:33 +08:00
@xboxv 不需要三秒,我之前测了一下 最少大概 500ms 有时可以 800ms 稳定可以
gzk329
2022-11-09 15:31:21 +08:00
@quicksand 我之前也怀疑 是在执行命令前 sleep 一会儿 按理说这时候命令还没有执行
但是这个方法执行的条件是 spark 作业已经进入最终态了 我怀疑是不是查到 spark 进入最终态了 然后其实它还没有执行完
yarn logs 这个命令是拿的 sparkd 的聚合日志 需要 spark 作业已经执行完
这个中间是不是有个时间差 导致的
所以我又去这个日志收集之前做了一个 sleep 好像没用 就很奇怪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/893762

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX