终端执行youtube-dl可正常下载视频 相同命令通过Java调用却中断无下载
问题原因
- 参数解析错误:
Runtime.exec(String)方法会默认按空格拆分命令参数,你命令中的--referer 'https://referrerUrl.html'里的单引号是shell环境下用来标识参数边界的,Java的exec并不会解析shell语法,会把单引号和内容按空格拆成多个错误参数,导致youtube-dl接收到的referer参数非法,执行中断。 - 输出流阻塞:你只读取了进程的标准输出流,没有消费错误输出流,youtube-dl的警告、错误信息会输出到stderr,缓冲区满后进程会被阻塞无法继续执行。
- 未等待进程执行完成:代码没有调用方法等待youtube-dl进程执行完毕,仅读完当前可用的标准输出内容后就直接进入下一次循环,进程被强制中断。
修复方案
用ProcessBuilder替代Runtime.exec,按数组传递参数,合并输出流,等待进程执行完成,修正后的代码如下:
for(String url: referrerSet) { // 拆分命令为参数数组,不需要加单引号,每个参数为独立元素 String[] commandArr = new String[]{ "youtube-dl", "https://player.vimeo.com/video/2352345", "--referer", "https://referrerUrl.html" }; ProcessBuilder pb = new ProcessBuilder(commandArr); // 把错误输出合并到标准输出,不需要单独读取两个流 pb.redirectErrorStream(true); Process proc = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = ""; while((line = reader.readLine()) != null) { System.out.println(line); } // 等待进程执行完成,可通过退出码判断执行结果 int exitCode = proc.waitFor(); if(exitCode != 0) { System.err.println("命令执行失败,退出码:" + exitCode); } proc.destroy(); }
注意:如果你的referrerSet里存的是完整的带--referer的命令字符串,建议提前拆分出各个参数存入数组,不要直接拼接成整串传入,避免参数解析错误。
内容的提问来源于stack exchange,提问作者mikegr3p
相关产品推荐
相关产品推荐

