我目前正在ServerSocket中编写一个基本的Web服务器,并且我试图使用java 8流来清理我的代码。这一直很好但是当我尝试使用流使用BufferedReader读取请求时,我的程序挂起并且请求永远不会被完全读入。我已经列出了下面的差异。
使用Streams:
InputStream stream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
System.out.println("----------REQUEST START---------");
List<String> rawRequest = in.lines()
.peek(System.out::println)
.map(line -> line.toString())
.collect(Collectors.toList());
System.out.println("----------REQUEST END---------\n\n");
没有Streams:
InputStream stream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
List<String> rawRequest = new ArrayList<>();
try {
System.out.println("----------REQUEST START---------");
// read only headers
for (String line = in.readLine(); line != null && line.trim().length() > 0; line = in.readLine()) {
System.out.println(line);
rawRequest.add(line);
}
System.out.println("----------REQUEST END---------\n\n");
} catch (IOException e) {
System.out.println("Error reading");
System.exit(1);
}
据我所知,除了错误处理之外,这些应该大致相同,只是在流代码段System.out.println("----------REQUEST END---------\n\n");
中永远不会运行。
答案 0 :(得分:4)
它们并不是大致相同的&#39;。您的迫切解决方案&#39;读取空行时终止。另一个只在流的末尾终止,因为对等方保持连接打开以便接收你的回复,所以它不会到达。
答案 1 :(得分:-1)
你应该检查空白和空白行是否像这样
in.lines()
.map(line -> line.trim())
.filter(line -> !line.isEmpty())
.map(line -> line.toString())
.collect(Collectors.toList());
这将跳过空行