java的常见的字符字节处理

前言:

在最近在学习nio的过程中,温习了以前学习的socket的io处理,发现最基础的处理操作离不开BufferedReader和PrintWriter,他们对应着socket的输入和输出流对象。另外一个问题是PrintWriter和PrintStream的区别。

PrintWriter和PrintStream的区别

这个问题,我查了资料,主要在jdk的说明上和在stackoverflow上,下面是二者的总结:
JDK的介绍

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 
}
  1. ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null。
  2. readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null。

特别要注意的是当reader.readLine已经读完之后,如果继续执行ready操作,会返回false; 因此,下面两段代码可能造成死循环:

while(reader.readLine()!==null){
      //执行操作  
     while(!reader.ready){  
     //阻塞,等待一段时间   
    }  
}

while(reader.readLine()!==null){
  //执行操作
  }  
while(!reader.ready){
  //阻塞,等待一段时间  
}

先写这么多,遇到问题在添加!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值