flush() 不会在 Process OutputStream 上刷新
flush() does not flush on a Process OutputStream
我尝试了多种方法来做到这一点:在每个 "flush()" 之后延迟 1 秒打印到进程输出流。
但是 flush 似乎并没有像预期的那样工作。有人能告诉我为什么吗?当调用 "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);
//...
发生的事情是,当您刷新代码时,它实际上清除了上次通过连接打印的所有数据,并清理了建立连接的通道。因此,它继续在同一行上附加字符。在每个字符串前后添加“\n”。例如,
w.write("\n 说 1...");
这会将您的每个字符串打印在单独的行上。这将在新行上打印每个字符串。
正如 Sanket Gupte 所回答的,您必须在消息末尾添加“\n”,
因为您使用 .readline() 读取了进程的输入流(我想),
它只会在出现 \n 时打印,无论您的 Thread.sleep(..) 调用如何。并且 flush 可以正常工作。它将缓冲区写入流。
- 我认为这不是过程的问题,因为我不知道
你是什么运行在后台我开始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 begins in 3...
...(2 秒)
say 2
我尝试了多种方法来做到这一点:在每个 "flush()" 之后延迟 1 秒打印到进程输出流。
但是 flush 似乎并没有像预期的那样工作。有人能告诉我为什么吗?当调用 "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);
//...
发生的事情是,当您刷新代码时,它实际上清除了上次通过连接打印的所有数据,并清理了建立连接的通道。因此,它继续在同一行上附加字符。在每个字符串前后添加“\n”。例如, w.write("\n 说 1..."); 这会将您的每个字符串打印在单独的行上。这将在新行上打印每个字符串。
正如 Sanket Gupte 所回答的,您必须在消息末尾添加“\n”, 因为您使用 .readline() 读取了进程的输入流(我想), 它只会在出现 \n 时打印,无论您的 Thread.sleep(..) 调用如何。并且 flush 可以正常工作。它将缓冲区写入流。
- 我认为这不是过程的问题,因为我不知道
你是什么运行在后台我开始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 begins in 3...
...(2 秒)
say 2