异常出现的场景:
(1)ssh项目,提供下载功能。项目使用tomcat部署;
(2)写了一个测试类来测试下载功能,执行时报异常:
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
下载类在struts中的配置(截取):
<action name="downloadOneFile" class="downloadOneFileAction"> <result type="stream" name="success"> <param name="inputName">downloadFile</param> <param name="contentType"></param> <param name="contentDisposition">attachment;filename=${filename}</param> <param name="bufferSize">4096</param> </result> </action>
在测试代码中使用 HttpURLConnection模拟浏览器发送http请求,读取应答体的部分代码如下:
上述代码是有问题的,本来bis中有1k的字节,结果我试图读取2k的字节,所以就报错了,原因找到了,怎么解决呢?
修改为:
private static byte[] readDataFromLength2(HttpURLConnection huc, int contentLength) throws Exception { InputStream in = huc.getInputStream(); BufferedInputStream bis = new BufferedInputStream(in); // 数据字节数组 byte[] receData = new byte[contentLength]; int readLength = 0; // 数据数组偏移量 int offset = 0; readLength = bis.read(receData, offset, contentLength); // 已读取的长度 int readAlreadyLength = readLength; while (readAlreadyLength < contentLength) { readLength = bis.read(receData, readAlreadyLength, contentLength - readAlreadyLength); readAlreadyLength = readAlreadyLength + readLength; } return receData; }
解决问题的过程:
1,刚开始以为是编码的问题,怀疑BufferedInputStream bis = new
BufferedInputStream(in);中BufferedInputStream的构造方法的第二个参数是编码(如GBK,UTF-8等),结果证明没有这个参数;
2,bis.read的第三个参数刚开始以为是索引,结果发现是长度(读取的字节);
3,while中比较时,应该是readAlreadyLength和contentLength进行比较。
参阅附件中com.http.util.HttpSocketUtil .附件中的项目是使用maven 构建的。
注意:读取BufferedInputStream时 使用while循环是必要的。
相关推荐
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
IllegalStateException: The specified child already has a parent.我的博客中有文章讲解
标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but...
1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang.IllegalStateException: Adapter is detached. 原因: 1.单线程一次执行一个请求可以正常执行,如果使用多线程,同时执行多个请求时就会...
HTTP Status 500 – Internal Server ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co
《Spring框架:开启Java开发新纪元》 Spring框架,由Rod Johnson创立并由Interface21公司推广,自诞生以来,它就致力于简化Java企业级应用(J2EE)的开发,提供了一种非侵入式的解决方案,极大地提高了开发效率。它...
Cause: java.lang.IllegalStateException: Cannot enable lazy loading because CGLIB is not available. Add CGLIB to your classpath.:java.lang.IncompatibleClassChangeError: class ...
这个存储库提供了一种在处理片段传输和后台任务时避免“java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState”的方法。 您可以在的非常权威的阅读有关该问题和可能的解决方案...
在Java开发中,Web服务(Web Service)是一种标准的接口,允许不同系统之间进行通信,而XFire是早年流行的一款用于构建和消费Web服务的开源框架。它使用SOAP(简单对象访问协议)和XML(可扩展标记语言)作为基础,...
标题中的"The full error is: java.lang.IllegalStateException"是一个典型的Java编程错误,通常表示在不合法或不适当的状态下调用了某个方法。这个错误通常暗示程序试图执行一个不能在这个特定时刻执行的操作。让...
Java是一种高级编程语言,通常用于开发跨平台的应用程序。然而,有时我们可能需要在Java程序中调用操作系统底层的动态链接库(DLLs on Windows,SOs on Linux,dylibs on macOS),以便利用C、C++等语言编写的高性能...
The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. ...
java.lang.IllegalStateException: The maximum Java version for OrientDb is Java 11. Please check current Java version meets this requirement. 参见: ...
### 面向对象编程与Objective-C:苹果iOS开发者指南 #### 一、概述 面向对象编程(Object-Oriented Programming, OOP)是一种广泛应用于软件开发中的编程范式,它将程序设计围绕“对象”进行组织。...
java.lang.IllegalStateException: Invalid name=“com.alibaba.dubbo.config.ProtocolConfig#0” contains illegal character, only digit, letter, ‘-’, ‘_’ or ‘.’ is legal 原因: 如果没有指定id属性,...
2. 在类中定义一些关键方法,如`@OnOpen`、`@OnClose`、`@OnMessage`和`@OnError`,分别用于处理连接打开、关闭、接收到消息和错误的情况。 3. `onOpen`方法接收客户端连接并存储相关信息,例如用户名和会话对象。 4...