浅谈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只能读取一次的问题就是小编分享给大家的全部内容了
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
?
总结:
这个问题最根本还是对java IO的read、reset方法的深入理解,尤其是read方法的内部实现原理。
附ServletInputStream.java源码
?
相关文章推荐
- 浅谈request.getinputstream只能读取一次的问题
- Servlet的Request.getInputStream()只能读取一次问题
- Servlet的Request.getInputStream()只能读取一次问题
- 解决request.getInputStream()只能读取一次的问题
- Servlet的Request.getInputStream()只能读取一次问题
- Servlet的Request.getInputStream()只能读取一次问题
- request.getInputStream()只能获取一次的问题
- spring boot 学习笔记(5) 解决HttpServletRequest inputStream只能读取一次的问题
- request.getInputStream()只能获取一次的问题
- request.getInputStream()只能获取一次的问题
- 解决request.getParameter() 、 request.getInputStream()和request.getReader()只能使用一次的问题
- request.getinputstream只能读取一次
- 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.
- HttpServletRequest.getInputStream() 只能读取一次
- request的getReader()和getInputStream()只能读取一次
- Servlet的Request.getInputStream()只能读取一次
- Request.getInputStream()读取数据遇到的问题
- 过滤器中ServletInputStream只能读取一次问题
- HttpServetRequest读取body只能一次的问题
- 浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题