【发布时间】:2017-09-14 19:41:04
【问题描述】:
我目前正在用 ServerSocket 编写一个基本的网络服务器,并且我正在尝试使用 java 8 流来清理我的代码。这一直很好,但是当我尝试使用 BufferedReader 使用流读取请求时,我的程序挂起并且请求永远不会完全读入。我在下面列出了不同之处。
使用流:
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");
没有流:
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);
}
据我所知,除了错误处理之外,这些应该大致相同,除了在流中 sn-p System.out.println("----------REQUEST END---------\n\n"); 永远不会运行。
【问题讨论】:
-
这是因为 lines() 永远不会返回,这是因为套接字仍然打开,因此阅读器在从行返回之前尝试读取更多数据(即,直到它到达 EOF) ()。
-
您自己的评论“只读标题”宁可放弃游戏,您不觉得吗?
-
顺便说一句,
map(line -> line.toString())绝对什么都不做。您正在将一个字符串...转换为一个字符串。
标签: java java-8 bufferedreader