我尝试了多种方法:在每次“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);
//...
答案 0 :(得分:1)
当您刷新代码时,它实际上清除了通过连接最后打印的内容的每个数据,并清除了建立连接的通道。因此,它继续将字符附加在同一行上。添加" \ n"在每个字符串之前和之后。例如, w.write(" \ n say1 ..."); 这将在单独的行上打印每个字符串。这会在新行上打印每个字符串。
答案 1 :(得分:1)
正如Sanket Gupte回答的那样,你必须在邮件末尾添加'\ n', 因为你用.readline()读了你的进程的输入流(我想), 它只会在出现\ n时打印,无论你的Thread.sleep(..)调用如何。并且冲洗按预期工作。它将缓冲区写入流。
你在后台运行的是什么我开始bash并通过echo
输出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 2\n");
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Serverbackup从3开始......
...(2秒)
说2