认识BufferedReader的readLine、ready,以及InputStream的available

最近,同学做实验的时候,在读取服务器端返回的时候,使用了BufferedReader类的readLine,他是这么写的,while(reader.ready()) {//执行读取操作,即readLine

}这个方法很经常被用到, 但是返回的却都是空,这是什么原因呢,查看了一下帮助文档,以及上网查了查,总结如下:

ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null,那么我们用while((str = reader.readLine()) != null)进行读取呢,readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null   ,举例如,一般只有在读到文件末尾时才会是空,至于读取服务器端的数据,一般不会是空,那么有时候我们采用特定的字符来代表结束,在网络上,一直等待输入,即使是对方什么也不输入,只是回车,readline也不会返回null,如果I/O中断,会返回I/O异常,还是不会返回null   除非你使用的数据流有固定长度(比如文件数据流,或者ByteArrayInputStream之类),而不是网络数据流(阻塞模式)。   在I/O阻塞模式下,你写的条件循环,是不合理的:   while((line   =   in.readLine())   !=   null)   
  应该如下:   while(网络状态)//状态可由从客户端读入数据时捕捉I/O异常来获取,所以如果要编写多用户服务程序,最好使用java.nio,他对这方面的处理会比单纯的阻塞IO会更好。

 

同理,InputStream的available也是非阻塞的,在网络中,很可能流延迟传输(而不是到达不了,服务器端很容易使用这样的代码,而是应用发生错误:

    byte[] bytes = new byte[in.available()];

    in.read(bytes);

结果是错误的,因为available返回的是0

那么解决方法有很多,比如可以一个一个字节的读,或者一个缓存大小字节的读,每次读都是阻塞方式的。所以可以放心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值