IO流知识盲点
2023-04-18 14:46:15 时间
IO流知识盲点
BufferedReader的readLine()方法读取不到换行和回车时会阻塞
readLine()在没有读取到换行符或回车符时。是不会返回的。而是处于阻塞状态。所以这个while在读取一条消息后。一直在readLine()上阻塞。当客户端发来下一条消息时。会继续下一次循环,等待读取下一条消息
1.原来readLine()方法在进行读取一行时,只有遇到回车( )或者换行符( )才会返回读取结果,这就是“读取一行的意思”,重要的是readLine()返回的读取内容中并不包含换行符或者回车符;
2.由于在客户端使用的readLine()来读取用户输入,所以当用户按下回车键是,readLine() 返回读取内容,但此时返回的内容并不包含换行符(查看readLine()源码,会将 , 或者 去除掉),而当在服务器端用readLine()再次读取时,由于读取的内容没有换行符,所以readLine()方法会一直阻塞等待换行符,这就是服务器端没有输出的原因。
解决方法:
在客户端每次输入回车后,手动给输入内容加入" "或" ",再写入服务器;
注意:
1、误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null。没有数据时会阻塞,在数据流异常或断开时才会返回null
2、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。 如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
3、使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞
相关文章
- 127.0.0.1 之本机网络通信过程知多少 ?!
- aspnetcore 使用serilog日志
- aspnetcore项目中kafka组件封装
- ASP.NET Core 中间件自定义全局异常处理
- WCF服务接口多,客户端在引用时出错!报WCF The maximum nametable character count quota (16384) has been exceeded while reading XML data错误
- .NET 使用NLog增强日志输出
- 深入分析STM32单片机I/O的8种工作模式
- 微软官方上线免费C#、.NET在线教程视频
- ASP.NET Core 移除已注册的过滤器
- 个人整理的 Windows 下 .NET 开发必装的软件
- [Abp 源码分析]十七、ASP.NET Core 集成
- 实话实说:只会.NET,会让我们一直处于鄙视链、食物链的下游
- .NET开发工程师的常见面试题
- ASP.NET Core中三个egg疼的路由函数
- 如何在 ASP.NET Core 中重写 URL
- Winform 如何使用Abp
- 【SpringBoot】Thymeleaf融合ajax
- wpf数据绑定
- wpf使用usercontrol自定义标签
- wpf绘制drawvisual卡顿