java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
一、場景
后端提供一個excel文件模板下載接口
二、異常信息
java.io.IOException: UT010029: Stream is closed
at io.undertow.servlet.spec.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:139) ~[undertow-servlet-2.2.19.Final.jar:2.2.19.Final]
at org.springframework.session.web.http.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:624) ~[spring-session-core-2.7.0.jar:2.7.0]
at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:167) ~[na:1.8.0_341]
三、異常分析
我們使用了ServletOutputStream來向客戶端發(fā)送響應。在finally塊中不需要關閉輸出流,因為Servlet容器會在請求處理完成后自動關閉輸出流。如果在finally塊中嘗試關閉已關閉的輸出流,就會拋出java.io.IOException: Stream is closed異常。因此,我們可以安全地省略關閉輸出流的代碼。
四、demo
@Operation(summary = "下載模版")
@GetMapping("download")
public Result<String> download(HttpServletResponse response) {
String fileName = "demo模版.xlsx";
ServletOutputStream outputStream = response.getOutputStream()
try {
// 清空下載文件的空白行(空白行是因為有的前端代碼編譯后產生的)
response.reset();
response.setCharacterEncoding("utf-8");
// 解決中文文件名亂碼問題
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=\"" + encodedFileName + "\";filename*=utf-8''" + encodedFileName);
// 設置文件類型
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
// 讀取文件并輸出到瀏覽器
File file = FileUtil.file("templates/demo_templates.xlsx");
outputStream.write(FileUtils.readFileToByteArray(file));
outputStream.flush();
} catch (IOException e) {
log.error("下載文件失敗,{}", fileName, e);
} finally {
// 不要在此處關閉輸出流
// outputStream.close();
}
return Result.success("下載成功");
}總結
到此這篇關于java.io.IOException: UT010029: Stream is closed異常分析及解決的文章就介紹到這了,更多相關java.io.IOException: UT010029內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 解決springboot報錯Failed?to?parse?multipart?servlet?request;?nested?exception?is?java.io.IOException問題
- 什么情況下會出現java.io.IOException?:?Broken?pipe這個錯誤以及解決辦法
- 解決Spring調用Feign報錯:java.io.IOException:Incomplete output stream問題
- Android創(chuàng)建文件時出現java.io.IOException:?Operation?not?permitted異常的解決方法
- java.io.IOException:你的主機中的軟件中止了一個已建立的連接踩坑實戰(zhàn)
- 解決Java中的java.io.IOException: Broken pipe問題
- AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法
- JSP上傳圖片產生 java.io.IOException: Stream closed異常解決方法
- Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111
相關文章
DTO 實現 service 和 controller 之間值傳遞的操作
這篇文章主要介紹了DTO 實現 service 和 controller 之間值傳遞的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
springboot+EHcache 實現文章瀏覽量的緩存和超時更新
這篇文章主要介紹了springboot+EHcache 實現文章瀏覽量的緩存和超時更新,問題描述和解決思路給大家介紹的非常詳細,需要的朋友可以參考下2017-04-04
記一次線上SpringCloud Feign請求服務超時異常排查問題
這篇文章主要介紹了記一次線上SpringCloud Feign請求服務超時異常排查問題,本項目與下游項目均注冊在Eureka上面,對這個1秒就超時感到很迷惑,于是開始查閱底層源碼之旅。需要的朋友可以參考下2022-01-01
spring?@Transactional注解中常用參數詳解
這篇文章主要介紹了spring?@Transactional注解中常用參數詳解,事物注解方式:?@Transactional,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-02-02
VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報錯兩種
這篇文章主要介紹了VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報錯兩種解決辦法的相關資料,第一種在setting.json中配置使用新版本JDK運行,第二種方法是切換至支持舊版本Jdk的插件版本,但不推薦,建議要確保使用最新JDK以避免兼容性問題,需要的朋友可以參考下2026-04-04
Mybatis-Plus updateById方法更新無效及空值處理過程
MyBatis-Plus的updateById默認不更新null值以防止誤操作,可通過UpdateWrapper/LambdaUpdateWrapper顯式設置,或全局配置、注解@TableField允許字段更新為空,需根據業(yè)務場景選擇合適方式2025-07-07

