与命令式解决方案

时间:2017-09-14 19:41:05

标签: java java-8 bufferedreader

我目前正在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");中永远不会运行。

2 个答案:

答案 0 :(得分:4)

它们并不是大致相同的&#39;。您的迫切解决方案&#39;读取空行时终止。另一个只在流的末尾终止,因为对等方保持连接打开以便接收你的回复,所以它不会到达。

答案 1 :(得分:-1)

你应该检查空白和空白行是否像这样

in.lines()
.map(line -> line.trim())
.filter(line -> !line.isEmpty())
.map(line -> line.toString())
.collect(Collectors.toList());

这将跳过空行