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

如何通过Java向批处理文件发送命令?

如何通过Java向批处理文件发送命令?

嘿,我懂你遇到的问题了!你现在的代码只能把Minecraft服务器批处理的输出同步到Java控制台,但完全没建立起向批处理发送命令的通道——你在Java控制台敲的help根本传不到服务器进程里,当然没反应啦。

咱们来改改代码,让Java既能实时展示服务器的输出,又能把你输入的命令直接发给服务器:

import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        // 启动Minecraft服务器的批处理进程
        Process p = Runtime.getRuntime().exec("run.bat");

        // 新开线程处理服务器的标准输出(把服务器日志同步到Java控制台)
        new Thread(() -> {
            try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
                String line;
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        // 新开线程处理服务器的错误输出(避免缓冲区满导致进程阻塞)
        new Thread(() -> {
            try (BufferedReader errorInput = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {
                String line;
                while ((line = errorInput.readLine()) != null) {
                    System.err.println("服务器错误日志: " + line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        // 处理用户输入,把命令发送给服务器进程
        try (Scanner scanner = new Scanner(System.in);
             OutputStreamWriter commandWriter = new OutputStreamWriter(p.getOutputStream())) {
            while (scanner.hasNextLine()) {
                String command = scanner.nextLine();
                // 发送命令时要加换行,服务器是按换行识别命令结束的
                commandWriter.write(command + "\n");
                // 强制刷新缓冲区,不然命令可能会卡在缓冲区里发不出去
                commandWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我给你拆解下关键改动:

  • 用线程并行处理输出:如果单线程处理服务器输出,一旦输出缓冲区满了就会卡住整个进程,用线程可以同时监听输出和接收你的输入,避免阻塞。
  • 新增p.getOutputStream():这就是Java和服务器进程之间的"命令管道"——你把命令写到这个流里,就跟直接在服务器控制台敲命令效果一样。
  • 输入后必须flush():Java的输出流默认会攒一批数据再发送,手动刷新能让服务器立刻收到你输入的命令。
  • 处理错误输出:不少进程会把错误信息单独写到错误流里,如果不管它,缓冲区满了会导致服务器进程挂起。

另外要注意:如果你的Java程序和run.bat不在同一个文件夹下,记得用绝对路径,比如"C:\\minecraft-server\\run.bat"。

备注:内容来源于stack exchange,提问作者DNL PLAYZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:14:34