您的位置:首页 > 产品设计 > UI/UE

浅谈request.getinputstream只能读取一次的问题

2017-03-28 14:51 393 查看
  首先,我们复习一下InputStream read方法的基础知识,

  java InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果读到最后,InputStream.read方法会返回-1,标志已经读取完了,如果想再次读取,可以调用inputstream.reset方法,position就会移动到上次调用mark的位置,mark默认是0,所以就能从头再读了。

  当然,能否reset是有条件的,它取决于markSupported,markSupported() 方法返回是否可以mark/reset

  我们再回头看request.getInputStream

  request.getInputStream返回的值是ServletInputStream,查看ServletInputStream源码发现,没有重写reset方法,所以查看InputStream源码发现marksupported 返回false,并且reset方法,直接抛出异常。

  InputStream.java

  ?

  综上所述,在request.getinputstream读取一次后position到了文件末尾,第二次就读取不到数据,由于无法reset(),所以,request.getinputstream只能读取一次。

  总结:

  这个问题最根本还是对java IO的read、reset方法的深入理解,尤其是read方法的内部实现原理。

  附ServletInputStream.java源码

  ?

  以上这篇浅谈request.getinputstream只能读取一次的问题就是小编分享给大家的全部内容了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: