gpt4 book ai didi

java - 在 PrintWriter 的情况下,为什么我应该在循环中而不是在循环之后刷新?

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:07 24 4
gpt4 key购买 nike

我的小演示程序中有一个服务器和一个客户端,我将一些字符串数据从客户端发送到服务器,然后为客户端重新发送这些数据,客户端也将其写到控制台。我对 PrtintWriter 的 flush 方法感到困惑,根据 JAVA 文档,它是 - 刷新流。经过一些研究,我逐渐熟悉了 autoflash 的概念:当 autoFlash 参数为真时,println、printf 或格式化方法将刷新输出缓冲区。我在这里唯一不明白的是为什么我应该在循环中而不是在循环之后使用 PrintWriter 的 flush 方法。 (在我的例子中,我在服务器端使用 PrintWriter。)Autoflash 做同样的事情,因为 println() 方法也在循环中。当我在循环后使用 flush 时,我的字符串数据没有出现在控制台上。提前感谢您的指导和帮助!

客户:

public class ClientDemo {
public static void main(String[] args) throws IOException {

final String CLIENTNAME = "<CLIENT>:";
final String SERVERADDRESS = "localhost";
final int PORT = 12312;

try {
Socket socket = new Socket(SERVERADDRESS, PORT);
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(socket.getInputStream());

System.out.println(CLIENTNAME + "Client starts");
List<String> lista = getList();

for(String userInput : lista){
out.println(userInput);
System.out.println("echo: " + scanner.nextLine());
}

} catch(IOException e) {
System.out.println(CLIENTNAME + "Error connecting to the server:" + e.getMessage());
}
}

private static List<String> getList(){
List<String> result = new ArrayList<>();
result.add("egy");
result.add("ketto");
result.add("harom");
result.add("negy");

result.add("ot");
result.add("hat");
result.add("het");
result.add("nyolc");
result.add("kilenc");
result.add("tiz");

return result;
}
}

服务器:

public class ServerDemo {
public static void main(String args[]) throws IOException {

final int PORT = 12312;
final String SERVERNAME ="<SERVER>:";

try {
ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
Scanner scanner = new Scanner(socket.getInputStream());

System.out.println(SERVERNAME + "Server starts...");

String inputLine;
while(scanner.hasNext()) {
inputLine = scanner.nextLine();
printWriter.println(inputLine);
printWriter.flush();
}

} catch (IOException e) {
System.out.println(SERVERNAME + "Error handleing client...");
}
}
}

最佳答案

您不必在写完每一行后都调用 flush。这样做是在阻塞 I/O。通过调用 flush,您可以确保您写入套接字的每一行都实际写入,而不仅仅是缓冲(稍后写入)。缓冲提高了 I/O 性能。但在这里似乎由于某些原因,您没有利用缓冲提供的优势。在写入完全完成之前,您一直处于阻塞状态。

关于java - 在 PrintWriter 的情况下,为什么我应该在循环中而不是在循环之后刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com