Java如何实现连续命令输入执行

读取控制台输入(交互式命令行)

使用 ScannerBufferedReader 循环读取用户输入,根据命令执行操作:

import java.util.Scanner;
public class ConsoleInputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入命令 (输入 'exit' 退出):");
        while (true) {
            System.out.print("> ");
            String command = scanner.nextLine().trim(); // 读取整行
            if ("exit".equalsIgnoreCase(command)) {
                break;
            } else if (!command.isEmpty()) {
                executeCommand(command); // 执行自定义逻辑
            }
        }
        scanner.close();
    }
    private static void executeCommand(String cmd) {
        // 示例:根据输入执行不同操作
        switch (cmd.toLowerCase()) {
            case "help":
                System.out.println("可用命令: help, version, calc");
                break;
            case "version":
                System.out.println("程序版本 1.0");
                break;
            case "calc":
                System.out.println("执行计算...");
                break;
            default:
                System.out.println("未知命令: " + cmd);
        }
    }
}

执行外部系统命令(如调用Shell)

通过 ProcessBuilder 启动外部进程并连续输入命令:

import java.io.*;
public class ExternalCommandExample {
    public static void main(String[] args) throws IOException {
        // 1. 启动进程(以Linux Bash为例)
        ProcessBuilder pb = new ProcessBuilder("/bin/bash");
        pb.redirectErrorStream(true); // 合并错误流到输入流
        Process process = pb.start();
        // 2. 获取输入输出流
        try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
             BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            // 3. 连续输入命令
            String[] commands = {"ls -l", "echo 'Hello Java'", "exit"}; // 需显式退出
            for (String cmd : commands) {
                writer.write(cmd + "\n"); // 写入命令
                writer.flush(); // 立即发送
                // 4. 读取输出
                String line;
                while ((line = reader.readLine()) != null) {
                    if (line.contains("$")) break; // 根据提示符结束读取
                    System.out.println("输出: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键注意事项

  1. 避免死锁

    • 同时读取输入流和错误流(使用 redirectErrorStream(true) 合并流)。
    • 为输出流添加 flush() 确保命令被发送。
  2. 资源释放

    • 使用 try-with-resources 自动关闭流。
    • 显式终止进程:process.destroy()
  3. 超时控制
    防止进程阻塞:

    if (!process.waitFor(5, TimeUnit.SECONDS)) {
        process.destroyForcibly();
    }
  4. 安全性

    • 避免直接执行用户输入的原始命令(防注入攻击)。
    • 对输入进行白名单校验。

应用场景对比

场景 适用情况 工具
控制台交互 内部Java逻辑处理 Scanner/BufferedReader
调用系统命令 操作文件、网络等外部资源 ProcessBuilder
长时交互进程 与Python/Shell脚本持续通信 Process + 多线程

常见问题解决

  • 乱码问题:指定流编码
    new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)
  • 命令无响应:启动子线程消费输出流(参考Oracle文档)。
  • 权限不足:Java进程需具备执行目标命令的系统权限。

引用说明:本文代码遵循Java官方规范,关键方法参考自Oracle官方文档 ProcessBuilder 和 Scanner,安全建议依据OWASP输入验证标准。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7948.html

(0)
酷番叔酷番叔
上一篇 2025年7月19日 12:40
下一篇 2025年7月19日 12:53

相关推荐

  • 傲游云网站是什么?有哪些核心功能?

    傲游云网站作为傲游浏览器生态的核心云端服务平台,依托其在浏览器领域十余年的技术沉淀,致力于为用户提供高效、安全、跨平台的云端数据管理与协同解决方案,随着云计算技术的普及,用户对数据跨设备访问、隐私保护及协同办公的需求日益增长,傲游云通过整合云端存储、同步技术及智能优化,打造了一个集“存储-同步-安全-协作”于一……

    2025年11月19日
    4600
  • Vim误操作后如何紧急撤销修改?

    核心不保存退出命令:q!(最常用)作用:强制退出当前文件,丢弃所有未保存的修改,场景:编辑单个文件时直接退出,操作示例: Press `Esc` → 输入 `:q!` → 按 `Enter`:qa!(多文件场景)作用:强制退出所有打开的文件(包括分屏、标签页),放弃全部修改,场景:同时编辑多个文件(如用 vim……

    2025年7月18日
    11900
  • 命令行下载东西怎么操作?

    在命令行环境下下载文件是开发者、系统管理员和高级用户的必备技能,相比图形界面工具,命令行下载具有高效、自动化、可脚本化等优势,尤其适合服务器环境或批量处理场景,本文将详细介绍几种主流命令行下载工具的使用方法、核心参数及常见应用场景,帮助读者掌握不同场景下的下载技巧,常用命令行下载工具及基础用法命令行下载工具中……

    2025年8月22日
    8800
  • 安全代码审计费用多少?影响价格的关键因素有哪些?

    安全代码审计费用是企业在软件开发流程中必须考量的重要成本项,它直接关系到软件产品的安全性、合规性以及后续的维护成本,合理的费用投入不仅能够有效防范潜在的安全风险,还能提升企业在市场中的竞争力和用户信任度,本文将从影响安全代码审计费用的主要因素、不同类型审计的费用范围、成本控制策略以及费用与价值的平衡等多个维度进……

    2025年11月29日
    4500
  • 深度学习如何突破现有技术瓶颈?

    深度学习作为人工智能领域的重要分支,近年来在学术界和工业界都取得了突破性进展,它通过模拟人脑神经网络的层次化结构,实现对复杂数据的自动特征提取和模式识别,已在图像识别、自然语言处理、语音识别等多个领域展现出强大的应用潜力,深度学习的基本原理深度学习的核心在于深层神经网络的设计与训练,与浅层学习模型不同,深度学习……

    2025年12月6日
    4500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信