如何通过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
相关产品推荐
相关产品推荐

