测试BufferedInputStream的mark()和reset()方法,提交文件时会出现Resetting to invalid mark

javaxman 2005-10-22 04:55:40
这是一段测试代码,在提交文件时会出现Resetting to invalid mark,比如提交一个txt文件。
java.io.IOException: Resetting to invalid mark
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.markSupported()) out.println("bis1 mark support!<br>");
bis1.mark(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.mark(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>");
%>
...全文
3472 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
treeroot 2005-10-27
  • 打赏
  • 举报
回复
说的很清楚,看英文原文呀
就是说:
在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。
treeroot 2005-10-26
  • 打赏
  • 举报
回复
谁说mark(0)是标记到零位置呀?看了说明文档吗?
javaxman 2005-10-26
  • 打赏
  • 举报
回复
public synchronized void mark(int readlimit)

在该输入流中标记当前位置。后续调用 reset 方法重新将流定位于最后的标记位置,从而后续读取能读取相同字节。
readlimit 参数提供输入流在标记位置变为非法前所允许读取多个字节数。


我死活看不懂他写的```
treeroot 2005-10-25
  • 打赏
  • 举报
回复
* The maximum read ahead allowed after a call to the
* <code>mark</code> method before subsequent calls to the
* <code>reset</code> method fail.
* Whenever the difference between <code>pos</code>
* and <code>markpos</code> exceeds <code>marklimit</code>,
* then the mark may be dropped by setting
* <code>markpos</code> to <code>-1</code>.

mark(0)时没有意思的
通俗的说如果你
mark(1000)
之后再读取1001个自己(超过1000),你就无法reset了,就是你上面的错误。
很好理解:你想重新获取最近的1000个字节,可以你已经读取的自己超过了它,你当然
无法回到开始的位置了。

你在这里设置mark(0),之后只要调用了read方法就不能reset了!
treeroot 2005-10-25
  • 打赏
  • 举报
回复
终于明白为什么了
javaxman 2005-10-25
  • 打赏
  • 举报
回复
都不愿意说吗
javaxman 2005-10-25
  • 打赏
  • 举报
回复
哪位高手花几分钟帮我看看呀!
javaxman 2005-10-25
  • 打赏
  • 举报
回复
不是很明白,mark(0)是标记到流的0位置,reset后就可以从新从0位置读吗?
王洲 2005-10-23
  • 打赏
  • 举报
回复
只有帮你顶一下了
javaxman 2005-10-23
  • 打赏
  • 举报
回复
请帮帮我呀```
javaxman 2005-10-23
  • 打赏
  • 举报
回复
谢谢!

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧