这是一段测试代码,在提交文件时会出现Resetting to invalid ,比如提交一个txt文件。
java.io.IOException: Resetting to invalid 
  java.io.BufferedInputStream.reset(BufferedInputStream.java:370)
  org.apache.jsp.request_jsp._jspService(request_jsp.java:57)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)uploap.jsp<html>
<body>
<form action="request.jsp" method=post ENCTYPE="multipart/form-data">
<input type="FILE" name="boy" size="38">
<br>
<input type="submit" name="g" value="??">
</form>
</body>
</html>do.jsp<%@page contentType="text/html; charset=gb2312"%>
<%@page import="java.io.*"%>
<%
int c;
byte fileByte[]=new byte[102400];
BufferedInputStream bis1 = new BufferedInputStream(request.getInputStream());
out.println("<br>test begin!<br>");
if (bis1.Supported()) out.println("bis1  support!<br>");
bis1.(0);
out.println("bis1 data:<br>");
while ((c = bis1.read(fileByte,0,10)) != -1) {
out.print("bis1:" + c + ";");
}
out.println("<br>bis1 data end!<br>");
bis1.reset();BufferedInputStream bis2 = bis1;
if (bis2 != null) out.println("<br>bis2 is not null!<br>");
bis2.(0);
out.println("<br>bis2 data:<br>");
while ((c = bis2.read(fileByte,0,10)) != -1) {
out.print("bis2:" + c + ";");
}
bis2.reset();
out.println("<br>test end!<br>");
%> 

解决方案 »

  1.   

    * The maximum read ahead allowed after a call to the 
         * <code></code> method before subsequent calls to the 
         * <code>reset</code> method fail. 
         * Whenever the difference between <code>pos</code>
         * and <code>pos</code> exceeds <code>limit</code>,
         * then the   may be dropped by setting
         * <code>pos</code> to <code>-1</code>.(0)时没有意思的
    通俗的说如果你
    (1000)
    之后再读取1001个自己(超过1000),你就无法reset了,就是你上面的错误。
    很好理解:你想重新获取最近的1000个字节,可以你已经读取的自己超过了它,你当然
    无法回到开始的位置了。你在这里设置(0),之后只要调用了read方法就不能reset了!
      

  2.   

    不是很明白,(0)是标记到流的0位置,reset后就可以从新从0位置读吗?
      

  3.   

    public synchronized void (int readlimit)在该输入流中标记当前位置。后续调用 reset 方法重新将流定位于最后的标记位置,从而后续读取能读取相同字节。
    readlimit 参数提供输入流在标记位置变为非法前所允许读取多个字节数。
    我死活看不懂他写的```
      

  4.   

    说的很清楚,看英文原文呀
    就是说:
    在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。