当前位置: 首页 > news >正文

【使用 Java 调用命令行工具:完整指南】

在 Java 中调用命令行工具是一个常见的需求,尤其是在需要与外部程序交互或执行系统命令时。本文将详细介绍如何使用 Java 调用命令行工具,并提供一个完整的示例来演示如何下载视频。


1. 为什么需要调用命令行工具?

命令行工具通常提供了强大的功能和灵活性,而 Java 可以通过调用这些工具来扩展其能力。常见的场景包括:
• 调用系统命令(如 pingls)。
• 使用第三方工具(如 yt-dlp 下载视频)。
• 执行脚本或批处理任务。


2. Java 调用命令行工具的核心类

Java 提供了 ProcessBuilderRuntime.getRuntime().exec() 来执行命令行工具。推荐使用 ProcessBuilder,因为它更灵活且易于管理。

ProcessBuilder 的优势

• 支持设置工作目录、环境变量和重定向输入输出。
• 更安全的参数处理(避免命令注入)。
• 更直观的 API。


3. 使用 ProcessBuilder 调用命令行工具

以下是一个简单的示例,演示如何使用 ProcessBuilder 调用命令行工具。

示例:调用 ping 命令
import java.io.BufferedReader;
import java.io.InputStreamReader;public class CommandLineExample {public static void main(String[] args) {try {// 创建 ProcessBuilder 对象ProcessBuilder processBuilder = new ProcessBuilder("ping", "google.com");processBuilder.redirectErrorStream(true); // 合并错误流和输出流// 启动进程Process process = processBuilder.start();// 读取命令行输出try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}}// 等待进程结束int exitCode = process.waitFor();System.out.println("进程结束,退出码: " + exitCode);} catch (Exception e) {e.printStackTrace();}}
}
输出示例
Pinging google.com [142.250.72.206] with 32 bytes of data:
Reply from 142.250.72.206: bytes=32 time=10ms TTL=115
Reply from 142.250.72.206: bytes=32 time=11ms TTL=115
Reply from 142.250.72.206: bytes=32 time=12ms TTL=115
Reply from 142.250.72.206: bytes=32 time=13ms TTL=115Ping statistics for 142.250.72.206:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:Minimum = 10ms, Maximum = 13ms, Average = 11ms
进程结束,退出码: 0

4. 调用第三方命令行工具(以 yt-dlp 为例)

以下是一个完整的示例,演示如何使用 Java 调用 yt-dlp 下载视频。

示例:调用 yt-dlp 下载视频
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;public class YtDlpDownloader {public static void downloadVideo(String videoUrl, String outputDir) {try {// 创建输出目录new File(outputDir).mkdirs();// 构造命令ProcessBuilder processBuilder = new ProcessBuilder("yt-dlp","-o", outputDir + File.separator + "%(title)s.%(ext)s","--no-check-certificate",  // 绕过证书验证videoUrl);// 合并错误流和输出流processBuilder.redirectErrorStream(true);// 启动进程Process process = processBuilder.start();// 打印命令行输出(调试用)try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}}// 等待进程结束int exitCode = process.waitFor();if (exitCode == 0) {System.out.println("下载成功!");} else {System.out.println("下载失败,错误码: " + exitCode);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {String videoUrl = "https://www.bilibili.com/video/BV1Xx411c7mD";String outputDir = "downloads";downloadVideo(videoUrl, outputDir);}
}
输出示例
[youtube] BV1Xx411c7mD: Downloading webpage
[info] BV1Xx411c7mD: Downloading 1 format(s)
[download] Destination: downloads\视频标题.mp4
[download] 100% of 123.45MiB in 00:12
下载成功!

5. 关键点解析

5.1 参数传递

• 将命令行参数作为 ProcessBuilder 的构造参数传入。
• 例如:new ProcessBuilder("yt-dlp", "-o", "output.mp4", videoUrl)

5.2 输出重定向

• 使用 process.getInputStream() 读取命令行输出。
• 使用 processBuilder.redirectErrorStream(true) 将错误流合并到输出流。

5.3 等待进程结束

• 使用 process.waitFor() 等待进程结束,并获取退出码。

5.4 异常处理

• 捕获 IOExceptionInterruptedException,处理可能的错误。


6. 注意事项

  1. 路径问题
    • 如果命令行工具不在系统 PATH 中,需指定绝对路径。
    • 例如:new ProcessBuilder("C:/tools/yt-dlp.exe", ...)

  2. 跨平台兼容性
    • Windows 使用 .exe 文件,Linux/macOS 使用无扩展名的可执行文件。

  3. 安全性
    • 避免直接拼接用户输入的命令,防止命令注入。

  4. 性能
    • 对于长时间运行的任务,建议使用多线程处理输出流。


7. 总结

通过 Java 调用命令行工具可以极大地扩展程序的功能。本文介绍了如何使用 ProcessBuilder 执行命令行工具,并提供了一个完整的示例来演示如何调用 yt-dlp 下载视频。希望这篇博客能帮助你更好地理解和使用 Java 调用命令行工具。

如果你有任何问题或建议,欢迎在评论区留言!

相关文章:

【使用 Java 调用命令行工具:完整指南】

在 Java 中调用命令行工具是一个常见的需求,尤其是在需要与外部程序交互或执行系统命令时。本文将详细介绍如何使用 Java 调用命令行工具,并提供一个完整的示例来演示如何下载视频。 1. 为什么需要调用命令行工具? 命令行工具通常提供了强大…...

pythonSTL---sys

sys 是 Python 标准库中的一个内置模块,它提供了许多与 Python 解释器和系统环境进行交互的功能。 sys方法 1. 导入 sys 模块 在使用 sys 库的功能之前,需要先导入它: import sys2. 命令行参数 (sys.argv) sys.argv 是一个包含命令行参数…...

数据分布偏移检测:保障模型在生产环境中的稳定性

数据分布偏移检测:保障模型在生产环境中的稳定性 引言 在机器学习系统从开发环境部署到生产环境的过程中,数据分布偏移问题是影响模型性能的主要挑战之一。当训练数据与生产环境中的数据分布不一致时,即使是经过精心调优的模型也可能表现出明显的性能下降。本文将深入探讨…...

redis删除与先判断再删除的区别

在Redis中,“先判断存在再删除”与“直接删除”的区别主要体现在‌操作效率、原子性保障、并发安全性‌三个方面,具体对比如下: ‌1. 操作效率‌ ‌直接删除‌:仅需执行DEL命令一次,无论键是否存在均直接操作&#xf…...

3.6、数字签名

目录 数字签名数字签名与验证过程 数字签名 数字签名是签名者使用自己的私钥对待签名数据的哈希值做密码运算得到的一个结果 第一签名者用自己的私钥来对我们待签数据的哈希值进行签名,直接对数据进行签名其实也是可以的,只是对数据签名,这…...

华为手机助手输入连接码时光标乱跳

问题复现:输入12345678,光标自动跳转导致连接码出现乱序情况。 千万别试着找出规律,已试动态规律非大牛误轻试 问题原因: 想啥呢?华哥的软件又不是我开发我要Know Why干啥 我只需关心解决方案 (可能时输入…...

本地化部署Deepseek关于Ollama 安全加固方案(新手易学)

本地化部署Deepseek关于Ollama 安全加固方案(新手易学) 本方案针对使用ChatBox调用Ollama部署DeepSeek-R1:14b模型时的安全防护需求,提供四重防护措施。 🔒 一、关闭外网访问(关键步骤) 1. 修改监听地址 …...

C++ STL算法函数 —— 应用及其操作实现

一、STL算法函数分类概述 STL算法库提供了大量实用函数,按功能可分为以下五类: 1. 不修改序列的操作 定义:这些算法不会改变容器中的元素,仅对数据进行查询或统计。 典型函数: 函数功能示例find(first, last, value…...

AI数字人:口播与唇形同步的福音,支持本地部署/批量生成/口齿清晰

Heygem:开源前端界面的老六玩家 好消息!Heygem 在 GitHub 上开源了!不过,嘻嘻,只是前端界面开源,感觉更像是来 GitHub 刷一波知名度。不过这依然是个值得关注的工具。让我们先来看看它的官方介绍&#xff…...

【鸿蒙】封装日志工具类 ohos.hilog打印日志

封装一个ohos.hilog打印日志 首先要了解hilog四大日志类型: info、debug、warm、error 方法中四个参数的作用 domain: number tag: string format: string ...args: any[ ] 实例: //普通的info日志,使用info方法来打印 //第一个参数 : 0x0…...

附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf

《2024 OWASP Top 10 基础设施安全风险》报告,由OWASP(开放网络应用安全项目)发布,旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识,并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施…...

Chatbox通过百炼调用DeepSeek

解决方案链接:评测|零门槛,即刻拥有DeepSeek-R1满血版 方案概览 本方案以 DeepSeek-R1 满血版为例进行演示,通过百炼模型服务进行 DeepSeek 开源模型调用,可以根据实际需求选择其他参数规模的 DeepSeek 模型。百炼平台…...

Vue前端项目部署到宝塔面板的详细过程

目录 前言 一、项目的打包与上传 1、修改前端项目 2、关于test环境的补充修改 3、打包前端项目 二、添加站点,启动项目 三、总结 前言 书接上回 SpringBoot项目部署到宝塔面板的详细过程-CSDN博客 本次以SmartAdmin的项目为例,通过宝塔面板部署…...

免费高质量贴图(Textures) 网站推荐

以下是一些提供 免费或高质量贴图(Textures) 的网站,包括 PBR 贴图、HDRI 贴图、材质等,适用于 Three.js、Blender、Unity、Unreal Engine 等软件。 🌍 1. Poly Haven(https://polyhaven.com/)⭐…...

C++进阶——map和set的使用

目录 1、序列式容器和关联式容器 2、set系列的使用 2.1 set和multiset的参考文档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 2.5 set的insert和迭代器遍历 2.6 set的find和erase 2.7 set的lower_bound和upper_bound 2.8 multiset和set的差异 2.9 349.…...

AI机器学习---Anaconda

Anaconda指的是一个开源的Python发行版本,其包含了Conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda 的下载文件比较大(约 531 MB),如果只需要某些包,或者需要节省带宽或存储空间…...

如何在Futter开发中做性能优化?

目录 1. 避免不必要的Widget重建 问题:频繁调用setState()导致整个Widget树重建。 优化策略: 2. 高效处理长列表 问题:ListView一次性加载所有子项导致内存暴涨。 优化策略: 3. 图片加载优化 问题:加载高分辨率…...

leetcode 75.颜色分类(荷兰国旗问题)

题目描述 题目分析 本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的,统计0、1、2的数量然后按顺序赋值,或者手写一个冒泡排序,whatever。 但是在这一题中我们主…...

JVM--垃圾回收

垃圾回收的概念 垃圾回收主要针对的是堆中的对象,堆是一个共享的区域,创建的对象和数组都放在这个位置。但是我们不能一直的创建对象,也不是所有的对象能一直存放,如果不进行垃圾回收,内存迟早会耗尽,及时…...

Spring boot3-Http Interface: 声明式编程

来吧 1.首先引入pom.xml依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 2.创建WebClientController控制器 import com.atguigu.boot3_07_http.serv…...

springboot EasyExcel 实现导入导出

1. 添加依赖 确保 Maven 依赖中包含 EasyExcel 3.0.5&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…...

基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…...

spring 创建单例 Bean 源码分析

一、创建单例Bean 1、创建单例 Bean 通过方法getBean()来创建单例bean。 代码入口&#xff1a; org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons spring boot version&#xff1a;2.6.13 org.springframework.beans.factory…...

GetCurrentTime

在实际编程中难免要获取当前时间并且进行格式化&#xff0c;本文给出了多种 GetCurrentTime() 方法以供选择。 C语言下使用strftime C 语言中可以使用 <time.h> 中的函数来获取和格式化时间 #include <stdio.h> #include <time.h>char* getCurrentTime() …...

HTB 学习笔记 【中/英】《Web 应用简介》P1

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 Web 应用 的概念、架构&#xff0c;以及与传统网站的区别。重点讲解了 Web 安全风险&#xff0c;包括 常见攻击方法&#xff08;SQL 注入、文件包含、不安全的文件上传等&#xff09;。介绍了 Web 渗透测试 的重要性&#…...

ROS catkin_make编译报错问题

对问题 CMake Error at graduation_design/CMakeLists.txt:226 (add_dependencies): The dependency target "graduation_design_generate_messages_cpp" of target "listener" does not exist 检查 generate_messages() 是否被注释 对 CMake Error at …...

【结构设计】3D打印创想三维Ender 3 v2

【结构设计】3D打印创想三维Ender 3 v2 文章目录 前言一、Creality Slicer1.2.3打印参数设置二、配件更换1.捆扎绑扎线2.气动接头3D打印机配件插头3.3D打印机配件Ender3pro/V2喷头套件4.读卡器 TF卡5.micro sd卡 三、调平四、参考文章总结 前言 使用工具&#xff1a; 1.创想三…...

并发编程2

接并发编程1 synchronized锁的实现 通过底层指令控制实现&#xff0c;Java提供的一种原子性内置锁&#xff0c;在进入synchronized后会从主内存复制一份共享变量到自己的工作内存&#xff0c;在工作内存中修改完成后&#xff0c;退出时会把工作内存的值写入到主内存&#xff…...

Linux 中 Git 使用指南:从零开始掌握版本控制

目录 1. 什么是 Git&#xff1f; Git 的核心功能&#xff1a; 2. Git 的安装 Ubuntu/Debian 系统&#xff1a; 验证安装&#xff1a; 3.gitee库 4. Git 的首次配置 配置用户名和邮箱&#xff1a; 查看配置&#xff1a; 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...

C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个&#xff0c;每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍&#xff0c;留下Luck 以及 路由器相关的 端口记录信息。 &#xff08;因为自…...

2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析

四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 ‌理论知识考察‌: 单选题和判断题中,会涉…...

谷歌Chrome或微软Edge浏览器修改网页任意内容

在谷歌或微软浏览器按F12&#xff0c;打开开发者工具&#xff0c;切换到console选项卡&#xff1a; 在下面的输入行输入下面的命令回车&#xff1a; document.body.contentEditable"true"效果如下&#xff1a;...

《DeepSeek深度使用教程:开启智能交互新体验》Deepseek深度使用教程

《DeepSeek使用教程&#xff1a;开启智能交互新体验》 在当今数字化时代&#xff0c;人工智能技术正以前所未有的速度改变着我们的生活和工作方式。DeepSeek作为一款强大的人工智能工具&#xff0c;凭借其卓越的自然语言处理能力和多领域应用潜力&#xff0c;受到了众多开发者…...

Dijkstra算法

Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;是一种经典的单源最短路径算法&#xff0c;用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边&#xff0c;因为负权边可能会导致算法的贪心策略失效。 Dijkstra算法的基本思想 Dijkstra算法…...

Python中的静态方法如何使用?

在Python里&#xff0c;类当中的方法可以分为多种不同的类型&#xff0c;其中staticmethod是一个十分有趣而又实用的功能。我们来好好地聊一聊什么是静态方法&#xff0c;它的用途是什么&#xff0c;以及如何在实际应用中使用它们&#xff01; 首先&#xff0c;定义一下静态方…...

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标&#xff0c;在最近的3个月&#xff0c;我需要进一步完善&#xff0c;达到可以试产的程度。 在这个过程当中&#xff0c;许多知识和体会一直在变。 qtv200到目前&#xff0c;虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…...

小脑萎缩会致命吗?

小脑萎缩&#xff0c;顾名思义&#xff0c;是指小脑的体积减小或结构发生异常&#xff0c;进而影响其正常功能。小脑作为人体重要的协调和运动控制中心&#xff0c;负责维持身体平衡、调节肌肉张力和协调运动等关键功能。当小脑出现萎缩时&#xff0c;患者可能会出现步态不稳、…...

pip install和conda install的区别

这里写目录标题 一、什么是 Python 依赖&#xff08;Python Dependencies&#xff09;&#xff1f;1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1&#xff1a;使用 venv&#xff08;推荐&#xff09;创建虚拟环境激…...

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能  網站管理功能&#xff1a; 支持創建和管理多個網站。配置虛擬主機&#xff08;Vhost&#xff09;和域名綁定。自動安裝常用應用&#xff08;如WordPress、Joomla等&#xff09;。  文件管理功能&#xff1a; 文件上傳、…...

requests库的request和response对象的属性和方法

Python requests库 request 参数信息 response 参数信息...

8664蛋糕的美味值

8664蛋糕的美味值 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;枚举 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in );int n sc.nextInt();int k s…...

【MySQL】数据库简要介绍和简单应用

目录 数据库简要介绍 SQL 的简单应用 需要注意的&#xff1a; 数据库简要介绍 数据库(database)是指长期存储在计算机内&#xff0c;有组织的、可共享的数据集合。它可视为一个电子化的文件柜&#xff0c;用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...

yolo环境 pytorch环境配置 CUDA安装

我的成功案例&#xff1a;首先安装python 3.12.9的conda虚拟环境 &#xff08;如果不安装3.12的会报错误ModuleNotFoundError&#xff1a;没有名为“numpy._core”的模块&#xff09; 然后安装11.8cuda &#xff08;其实我是可以最高安装12.6的cuda但我实测&#xff0c;太高版…...

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述 camellia-redis-proxy是一款高性能的redis代理&#xff08;https://github.com/netease-im/camellia&#xff09;&#xff0c;使用netty4开发&#xff0c;主要特性如下&#xff1a; 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…...

python相关语法的学习文档1

python相关语法的学习文档1 1、tqdm tqdm 是 Python 中一个非常流行的进度条库,可以实时显示循环或任务的进度。它简单易用,支持多种场景(如循环、文件处理、多线程/进程等)。以下是详细的使用讲解: 1.1 安装 pip install tqdm1.2 基本用法 from tqdm import tqdm impo…...

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具&#xff0c;它允许设计师和开发者快速创建高保真原型&#xff0c;以展示应用或网站的设计和功能。通过引入各种元件库&#xff0c;如ElementUI元件库&#xff0c;可以极大地丰富Axure的原型设计能力&#xff0c;使其更加贴近实际开发中的UI组…...

Java 并发编程——BIO NIO AIO 概念

参考 Java 并发编程——BIO NIO AIO 概念 阻塞与非阻塞、同步与异步概念 系统调用、缓存、物理设备阻塞与非阻塞同步与异步 四种主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路复用异步 IO select&#xff0c;poll&#xff0c;epoll 系统调用命令...

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…...

笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版

文章目录 1.环境准备1.1 硬件环境1.2 OS 环境1.3 Python 环境 2.环境安装2.1 CUDA 驱动下载安装2.2 torch 库下载安装2.3 transformers 库安装2.3 accelerate 库安装2.4 验证 CUDA 是否可用2.5 下载 Qwen1.5-0.5B 大模型 3.测试大模型3.1 加载大模型3.2 简单对话3.3 亲测体验感…...

SpringBoot事件驱动

1、概述 Spring事件驱动采用了观察者设计模式&#xff0c;主要作用就是实现对象之间的松耦合通信。它的核心思想是通过事件的发布和监听来实现不同组件之间的交互。&#xff08;跟mq挺像&#xff09; 基础概念&#xff1a; 事件&#xff08;Event&#xff09;: 在Spring中&am…...