有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

bufferedreader JavasocketreadLine()方法奇怪的行为

我在socket服务器中有以下代码片段用于测试

try (BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    PrintWriter out = new PrintWriter(client.getOutputStream(), true)){

    String input;
    while ((input = in.readLine()) != null) {
        if (input.equalsIgnoreCase("exit")) {
            System.out.println("Received `exit`... closing client " + client.getRemoteSocketAddress());
            break;
        }

        System.out.println("Received: " + input);
        out.println("OK");
    }
} catch(IOException e) {
    e.printStackTrace();
}

当我向它发送带有空格的行时,例如Hello World,它只打印Hello。似乎readLine()方法的行为类似于在读取空白时终止行

这是一个字符编码问题还是什么?任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    在评论中,您提到了如何发送数据:

    Scanner keyboard = new Scanner(System.in);
    out.println(keyboard.next());
    

    实际上,Scanner.next()调用分别返回每个单词,如the documentation中所述:

    A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace.

    天真地说,您可能希望在键入空格后立即在服务器上看到Hello。这不会发生,因为默认情况下输入流是行缓冲的,所以Scanner在按Enter键之前不会看到任何输入

    要逐行读取输入,不需要Scanner;只需将System.in包装在BufferedReader中,并使用其readLine()方法