`
sunnylocus
  • 浏览: 875725 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

Tomcat输出流异常的解决

    博客分类:
  • Java
阅读更多

     前几天做了一个jsp文件下载的页面,刚开始是直接链接到要下载的文件上,在装有像迅雷,网际快车下载软件没有问题,但在没有装这些软件的机器上会把文件直接打开,如果是一个带后缀名为.rar压缩文件后会直接打开,页面全是乱码。最后重新做了一遍,download.jsp页面接收文件的id,根据这个id号找到对应的文件所有在的路径,把要下载的文件转换成流输出,下载的功能实现了,不过每次下载文件tomcat都要报

java.lang.IllegalStateException:getOutputStream() has already been called for this response

 

查了好多的资料,终于明白了报错的原因

        在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流,没有处理好的原因。
具体的原因就是:
        在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request,HttpServletResponse response)的最后有一段这样的代码
finally {
       if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
     }

这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。

 

在使用完输出流以后加入下面两条语句
out.clear();
out = pageContext.pushBody();

 

示例:download.jsp

//新建文件输入输出流
OutputStream output = null;
FileInputStream fis = null;
try{
    //新建File对象
    File f = new File("文件路径");
    //新建文件输入输出流对象
   output = response.getOutputStream();
    fis = new FileInputStream(f);
    //设置每次写入缓存大小
    byte[] buffer = new byte[1024];
    //把输出流写入客户端
    int i = =1;
    while((i = fis.read(b)) != -1){
      output.write(buffer, 0, i);
    }
    output.flush();
}
catch(Exception e){
    e.printStackTrace();
}
finally{
    if(fis != null){
      fis.close();
      fis = null;
    }
    if(output != null){
      output.close();
      output = null;
    }
    if(out != null){
    //下面这两行解决getOutputStream() has already been called for this response异常
      out.clear();
      out = pageContext.pushBody();
    }
}

 

分享到:
评论

相关推荐

    tomcat 异常

    - `IOException`:在处理输入/输出流时,如果发生错误,例如网络中断或磁盘满,会抛出此异常。 - `ServletException`:与Servlet相关的错误,如初始化失败、找不到Servlet类等。 2. **日志分析**: - Tomcat的...

    Tomcat 不显示详细日志的问题

    Tomcat 不显示详细日志的问题解决方案 Tomcat 是一个流行的 Java Web 服务器,用于部署和运行基于 Java 的 Web 应用程序。但是,在某些情况下,Tomcat 的详细错误日志可能会消失,只报一个万恶的 Context [] ...

    tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

    1. 注意输出顺序:在JSP中首先使用输出流(response.getOutputStream())输出数据,然后再使用字符输出流(response.getWriter())输出文本数据。如果需要先输出文本数据,必须确保之后不再使用输出流。 2. 使用...

    解决Invalid byte 1 of 1-byte UTF-8 sequence

    2. "xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence-中文版的window下java的默认的编码为GBK.url":这个文件名暗示了解决XML文件读取异常的方法,尤其是在Windows环境下,Java默认的文件编码可能是GBK,这可能...

    研究源码工程,先java、spring、tomcat

    此外,Java集合框架(如ArrayList、HashMap等)、异常处理机制、并发编程模型(线程和锁)以及输入/输出流等也是开发者必须掌握的知识。 其次,Spring框架是Java企业级应用开发的首选框架,它简化了开发过程,提供...

    解决Tomcat 中catalina.out持续累加问题

    catalina.out文件是Tomcat服务器的标准输出和标准错误的记录文件。每当Tomcat启动和运行应用时,所有的日志信息、异常堆栈跟踪以及其他运行信息都会被重定向到这个文件中。这个文件对于诊断问题和监控应用程序的运行...

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。 本文解决办法: 在前面所说的网络解决办法中,使用的是一种躲避的方式解决该问题,也就是置之不理。 这里提供一个...

    启动tomcat报错org.hibernate.cache.CacheProvider

    5. **日志分析**:了解如何阅读和分析Java应用的日志输出,找出错误信息和异常堆栈。 6. **错误排查技巧**:学习如何使用IDE的调试功能,或者通过打印变量值来追踪问题。 7. **源码阅读**:在某些情况下,阅读...

    eclipse导入Javaweb项目出现大面积错误时解决办法.docx

    当这两个组件的版本不匹配时,Eclipse可能无法正确解析项目的依赖,导致编译错误或运行时异常。 解决这个问题的步骤如下: 1. **检查JDK版本**: - 右键点击项目,选择“属性”(Properties)。 - 在左侧导航栏中...

    myself prob

    4. **日志和监控**: Tomcat的日志系统,以及如何通过修改配置来增强日志输出,以便进行故障排查。 5. **Java编程基础**: 如果"probe"是一个Java程序,需要理解Java的基本语法和类库,特别是与网络和服务器交互的部分...

    Windows 下整合 weblogic10 jsf1.2 hibernate3

    - **异常解释**:当 Servlet 响应已经使用了一个输出流(OutputStream),再尝试使用 PrintWriter 类写入文本时会出现此异常。这是因为一个响应只能使用一种类型的输出方式。 - **解决方法**: - 在写入数据...

    SSD ISS 关于JAVA的作业

    4. **输入输出流**:掌握文件I/O操作,包括字节流和字符流,以及对象序列化和反序列化。 5. **多线程**:理解线程的创建和同步,以及synchronized关键字、wait()、notify()方法的用法。 6. **网络编程**:学习...

    Exam在线考试java

    1. Java基础:包括类、对象、封装、继承、多态等概念,以及异常处理、输入输出流等。 2. Spring Boot框架:用于快速开发Java Web应用,提供了自动配置、内嵌Tomcat服务器、MVC框架等功能。 3. MySQL数据库操作:包括...

    01------helloServlet.rar

    2、设置响应的内容类型以及字符编码方式:获取响应流之前设置有效果 3、网页上的换行效果:网页上的换行效果需要输出 异常: Desktop>javac HelloServlet.java HelloServlet.java:2: 错误: 编码GBK的不可...

    《Java程序设计》课程案例探讨.zip

    通过案例分析,我们可以系统地探讨Java程序设计的关键知识点,包括但不限于语法基础、面向对象编程、异常处理、集合框架、多线程、输入/输出流、网络编程以及Java应用程序和Web应用程序的开发。 1. **Java语法基础*...

    android手写Http协议上传文件

    在Android中,我们可以通过`java.net.Socket`类创建Socket对象,然后通过输入输出流与服务器进行数据交换。Socket连接建立后,客户端可以向服务器发送HTTP请求。 3. **构建HTTP请求**: 在手写HTTP协议时,我们...

    Java 项目经验.pdf

    5. **输入输出流**:理解IO流的概念,包括原始流和包装流,熟悉InputStream、OutputStream、Reader、Writer,以及对象序列化和反序列化。理解Adapter设计模式和Decorator设计模式在流类中的应用。 6. **多线程**:...

    j2ee学习过程~~~~~~~~~~~~~~~~~~~

    这包括但不限于异常处理、输入输出(I/O)流、多线程和集合类的使用。异常处理是Java程序中必不可少的部分,理解try-catch-finally结构,以及如何捕获和处理不同类型的异常。I/O流分为字节流、字符流和对象序列化,要...

Global site tag (gtag.js) - Google Analytics