前言:
在最近在学习nio的过程中,温习了以前学习的socket的io处理,发现最基础的处理操作离不开BufferedReader和PrintWriter,他们对应着socket的输入和输出流对象。另外一个问题是PrintWriter和PrintStream的区别。
PrintWriter和PrintStream的区别
这个问题,我查了资料,主要在jdk的说明上和在stackoverflow上,下面是二者的总结:
PrintWriter实现了PritnStream的所有print方法。对于PrintStream,所有println方法都在内部调用相应的print方法,比如println(charx)的方法体就是调用print(x);再写入一个平台相关的换行符。PrintStream构建时会在内部new一个BufferedWriter,所有print方法都在内部调用这个Writer的write方法(write(String)或write(char[]))——对于print(char[]),直接调用write(char[]);对于其他的print方法,先用String.valueOf获得参数的字符串表示,然后调用write(String)。 对于PrintWriter,所有println方法也都在内部调用print方法,print方法调用write方法。传入OutputStream时,PrintWriter会在内部构造一个BufferedWriter;而传入Writer时,PrintStream内部直接使用该Writer,此时PrintWriter是否进行了缓冲全看该Writer。
上述的内容还需看下源码才能加深映象
BufferedReader进行readLine什么时候返回null
while(reader.ready()) {
//执行读取操作,即readLine
}
- ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null。
- readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null。
特别要注意的是当reader.readLine已经读完之后,如果继续执行ready操作,会返回false; 因此,下面两段代码可能造成死循环:
while(reader.readLine()!==null){
//执行操作
while(!reader.ready){
//阻塞,等待一段时间
}
}
while(reader.readLine()!==null){
//执行操作
}
while(!reader.ready){
//阻塞,等待一段时间
}
先写这么多,遇到问题在添加!