BufferedReader的lines

用socket处理http请求的时候,为了省事,直接使用BufferedReader类

1
2
BufferedReader r = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String res = r.lines().collect(Collectors.joining());

发现在进行lines处理的时候,整个线程会阻塞,但是只处理第一行的时候不会阻塞,

1
String res = r.lines().findFirst().orElse("");

查询之后才知道,lines方式本质是循环(通过迭代器)调用readLine方法,且readLine方法只有遇到\r ,\n ,\r\n才会返回,当stream处理到最后一行的时候,猜测可能是requestHeaders并没有换行符,导致readLine一直等待,
解决:最后决定不使用lines方法,直接用read(char[])方法

1
2
3
char[] chars = new char[1024];
r.read(chars);
String request = String.valueOf(chars).trim();

也可以用CharBuffer,

1
2
3
CharBuffer allocate = CharBuffer.allocate(1024);
r.read(allocate);
System.out.println(allocate.flip().toString());