You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

终端执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:05