>我尝试了多种方法:在每个"flush()"之后打印到进程输出流,延迟 1 秒。但是同花顺似乎并没有像预期的那样工作。有人可以告诉我为什么吗?我得到的是调用"close()"时的一个组合String
。在"close()"开始行动之前不会打印任何内容。
上下文:这应该关闭我的 minecraft 服务器并在之后运行备份。
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
w.write("say Serverbackup begins in 3...");
w.flush();
Thread.sleep(1000);
w.write("say 2...");
w.flush();
Thread.sleep(1000);
w.write("say 1...");
w.flush();
Thread.sleep(1000);
w.write("say GAME OVER!!!!!!!!!!!!!...");
w.flush();
w.write("stop");
w.flush();
w.close();
process.waitFor(10, TimeUnit.SECONDS);
//...
正如Sanket Gupte回答的那样,您必须在消息末尾添加"",既然你用 .readline() 读取进程的输入流(我想),它只会在出现 时打印,无论您的 Thread.sleep(..) 调用如何。冲洗按预期工作。它将缓冲区写入流。
- 我建议这不是过程的问题,因为我不知道
-
你在后台运行什么我开始 bash 并通过回声输出
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash"); processBuilder.redirectErrorStream(true); try { final Process bash = processBuilder.start(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(bash.getOutputStream())); new Thread(new Runnable() { public void run() { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bash.getInputStream())); String line; try { while ((line = bufferedReader.readLine()) != null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }).start(); bufferedWriter.write("echo say Serverbackup begins in 3...n"); bufferedWriter.flush(); Thread.sleep(2000); bufferedWriter.write("echo say 2n"); bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
服务器备份从 3...
。(2秒)
说 2
正在发生的事情是,当您刷新代码时,它实际上会清除上次通过连接打印的所有数据,并清理建立连接的通道。因此,它不断在同一行上附加字符。在每个字符串前后添加""。例如 w.write(" say1...");这会在单独的行上打印每个字符串。这将在新行上打印每个字符串。