Print Writer write() 和 println()
Print Writer write() and println()
我目前正在学习Java网络编程。在我的一个程序中,我只有一个发送客户端消息的 EchoServer。但是我在客户端中认识到 Printwriter.write()
方法只是在我关闭编写器时发送,而 .println()
方法工作正常。我也试过带自动冲洗和不带自动冲洗。
作品:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.println(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
无效:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.write(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
有人可以向我解释为什么会这样吗?
是的,我以前绝对见过这个。如果您使用的是 PrintWriter 或其他具有自动刷新功能的 Writer,则无需调用 flush()。但除此之外,要发送消息,您必须调用 flush() 以获取要发送的 Writer / OutputStream 中的内容。
the Printwriter.write() method just sends when I close the writer while the .println() method works fine
这里好像有两个问题,第一个跟写有关,第二个跟读有关:
代码创建了一个 PrintWriter
自动行刷新。当您使用 println
时,新行会导致编写器刷新。在不换行的情况下使用 write
时,PrintWriter
不会刷新(您可以在 out.write
之后调用 out.flush
以强制刷新 Writer
)。
假设接收端正在使用Scanner.readLine()
,它期待一个新行或者将等到它接收到一个。 println
自动将新行附加到字符串的末尾,使用 write
您必须显式发送新行 out.write(line + "\n");
我目前正在学习Java网络编程。在我的一个程序中,我只有一个发送客户端消息的 EchoServer。但是我在客户端中认识到 Printwriter.write()
方法只是在我关闭编写器时发送,而 .println()
方法工作正常。我也试过带自动冲洗和不带自动冲洗。
作品:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.println(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
无效:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.write(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
有人可以向我解释为什么会这样吗?
是的,我以前绝对见过这个。如果您使用的是 PrintWriter 或其他具有自动刷新功能的 Writer,则无需调用 flush()。但除此之外,要发送消息,您必须调用 flush() 以获取要发送的 Writer / OutputStream 中的内容。
the Printwriter.write() method just sends when I close the writer while the .println() method works fine
这里好像有两个问题,第一个跟写有关,第二个跟读有关:
代码创建了一个
PrintWriter
自动行刷新。当您使用println
时,新行会导致编写器刷新。在不换行的情况下使用write
时,PrintWriter
不会刷新(您可以在out.write
之后调用out.flush
以强制刷新Writer
)。假设接收端正在使用
Scanner.readLine()
,它期待一个新行或者将等到它接收到一个。println
自动将新行附加到字符串的末尾,使用write
您必须显式发送新行out.write(line + "\n");