下载文件时可以正常下载,但TOMCAT的日志中报: 
2008-01-10   09:31:38   StandardWrapperValve[jsp]:   Servlet.service()   for   servlet   jsp   threw   exception 
java.io.IOException:   Stream   closed 
at   org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:202) 
at   org.apache.jasper.runtime.JspWriterImpl.clearBuffer(JspWriterImpl.java:157) 
错误,请问怎么能不出现这个错误? 
下载页面代码如下: 
<%@page   import="java.util.*"%> 
<%@page   import="java.io.*"%> 
<%@page   import="java.net.*"%> 
<% 
String   pathname   =   request.getParameter("path"); 
String   filename=request.getParameter("filename"); 
out.print(pathname+filename); response.setContentType("APPLICATION/OCTET-STREAM"); 
response.setHeader("Content-Disposition","attachment;   filename="+filename); FileInputStream   fileInputStream   =new   FileInputStream(pathname+filename); 
out.print(pathname+filename); 
out.clear(); 
out.close(); 
ServletOutputStream   myout=response.getOutputStream(); 
int   i; 
while   ((i=fileInputStream.read())   !=   -1) 
{myout.write(i);} 
fileInputStream.close(); 
myout.close(); %> 

解决方案 »

  1.   

    建议在finally里面关闭你的输入输出。
      

  2.   

    写个下载servlet   配置一下就能用了   
        
      import   java.io.*;   
      import   javax.servlet.*;   
      import   javax.servlet.http.*;   
      import   java.net.*;   
        
      public   class   DownloadServlet   extends   HttpServlet   {   
              private   String   contentType   =   "application/x-msdownload";   
              private   String   enc   =   "utf-8";   
              private   String   fileRoot   =   "";   
        
              public   void   init(ServletConfig   config)   throws   ServletException   {   
                      String   tempStr   =   config.getInitParameter("contentType");   
                      if   (tempStr   !=   null   &&   !tempStr.equals(""))   {   
                              contentType   =   tempStr;   
                      }   
                      tempStr   =   config.getInitParameter("enc");   
                      if   (tempStr   !=   null   &&   !tempStr.equals(""))   {   
                              enc   =   tempStr;   
                      }   
                      tempStr   =   config.getInitParameter("fileRoot");   
                      if   (tempStr   !=   null   &&   !tempStr.equals(""))   {   
                              fileRoot   =   tempStr;   
                      }   
              }   
        
              public   void   doGet(HttpServletRequest   request,   HttpServletResponse   response)   throws   ServletException,   IOException   {   
                      //String   filepath   =   request.getParameter("filepath");   
                      String   filepath   =   "test.txt";   
                      String   fullFilePath   =   fileRoot   +   filepath;   
        
                      File   file   =   new   File(fullFilePath);   
        
                      if   (file.exists())   {   
                              String   filename   =   URLEncoder.encode(file.getName(),   enc);   
                              response.reset();   
                              response.setContentType(contentType);   
                              response.addHeader("Content-Disposition",   "attachment;   filename=\""   +   filename   +   "\"");   
                              int   fileLength   =   (int)   file.length();   
                              response.setContentLength(fileLength);   
        
                              if   (fileLength   !=   0)   {   
        
                                      InputStream   inStream   =   new   FileInputStream(file);   
                                      byte[]   buf   =   new   byte[4096];   
        
                                      ServletOutputStream   servletOS   =   response.getOutputStream();   
                                      int   readLength;   
                                      while   (((readLength   =   inStream.read(buf))   !=   -1))   {   
                                              servletOS.write(buf,   0,   readLength);   
                                      }   
                                      inStream.close();   
                                      servletOS.flush();   
                                      servletOS.close();   
                              }   
                }   
      }   
              public   void   doPost(HttpServletRequest   request,   HttpServletResponse   response)   throws   ServletException,   IOException   {   
                      doGet(request,   response);   
      }   
      }
      

  3.   

    因为tomcat在你的下载完成后,还有使用out这个东西,而他已经被你的response占用了,才报这个异常。所以在jsp里面不建议用于下载,图片显示等与Stream有关的东西,那些放到servlet里面比较好。一个显示图片的servlet供你参考,特别是后面的配置,可以让你的程序看上去还是在用.jsp 而不用修改你现在的程序了。http://www.java2000.net/viewthread.jsp?tid=93
      

  4.   

    感谢回答,请问如果想在JSP中实现,如何避免这个异常呢?应为现在功能已经实现了,就是有这个异常,谢谢!
      

  5.   

    你可以尝试,把jsp最后面的所有空白都去掉 ,变成只有%>结尾,不要有任何空格和换行,而且以后也不要进行任何页面整理
    及时是一个空格,jsp也要翻译成
    out.print(" ");
    而这时候out已经不能 print了