最近,同学做实验的时候,在读取服务器端返回的时候,使用了BufferedReader类的readLine,他是这么写的,while(reader.ready()) {//执行读取操作,即readLine
}这个方法很经常被用到,
ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null,那么我们用while((str = reader.readLine()) != null)进行读取呢,readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null
同理,InputStream的available也是非阻塞的,在网络中,很可能流延迟传输(而不是到达不了,服务器端很容易使用这样的代码,而是应用发生错误:
结果是错误的,因为available返回的是0
那么解决方法有很多,比如可以一个一个字节的读,或者一个缓存大小字节的读,每次读都是阻塞方式的。所以可以放心