java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
一、場景
后端提供一個(gè)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ā)送響應(yīng)。在finally塊中不需要關(guān)閉輸出流,因?yàn)镾ervlet容器會(huì)在請求處理完成后自動(dòng)關(guān)閉輸出流。如果在finally塊中嘗試關(guān)閉已關(guān)閉的輸出流,就會(huì)拋出java.io.IOException: Stream is closed異常。因此,我們可以安全地省略關(guān)閉輸出流的代碼。
四、demo
@Operation(summary = "下載模版")
@GetMapping("download")
public Result<String> download(HttpServletResponse response) {
String fileName = "demo模版.xlsx";
ServletOutputStream outputStream = response.getOutputStream()
try {
// 清空下載文件的空白行(空白行是因?yàn)橛械那岸舜a編譯后產(chǎn)生的)
response.reset();
response.setCharacterEncoding("utf-8");
// 解決中文文件名亂碼問題
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=\"" + encodedFileName + "\";filename*=utf-8''" + encodedFileName);
// 設(shè)置文件類型
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 {
// 不要在此處關(guān)閉輸出流
// outputStream.close();
}
return Result.success("下載成功");
}總結(jié)
到此這篇關(guān)于java.io.IOException: UT010029: Stream is closed異常分析及解決的文章就介紹到這了,更多相關(guān)java.io.IOException: UT010029內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決springboot報(bào)錯(cuò)Failed?to?parse?multipart?servlet?request;?nested?exception?is?java.io.IOException問題
- 什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法
- 解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output stream問題
- Android創(chuàng)建文件時(shí)出現(xiàn)java.io.IOException:?Operation?not?permitted異常的解決方法
- java.io.IOException:你的主機(jī)中的軟件中止了一個(gè)已建立的連接踩坑實(shí)戰(zhàn)
- 解決Java中的java.io.IOException: Broken pipe問題
- AndroidApk混淆編譯時(shí),報(bào)告java.io.IOException...錯(cuò)誤解決辦法
- JSP上傳圖片產(chǎn)生 java.io.IOException: Stream closed異常解決方法
- Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111
相關(guān)文章
DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作
這篇文章主要介紹了DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
利用Springboot實(shí)現(xiàn)Jwt認(rèn)證的示例代碼
這篇文章主要介紹了利用Springboot實(shí)現(xiàn)Jwt認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時(shí)更新
這篇文章主要介紹了springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時(shí)更新,問題描述和解決思路給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-04-04
記一次線上SpringCloud Feign請求服務(wù)超時(shí)異常排查問題
這篇文章主要介紹了記一次線上SpringCloud Feign請求服務(wù)超時(shí)異常排查問題,本項(xiàng)目與下游項(xiàng)目均注冊在Eureka上面,對這個(gè)1秒就超時(shí)感到很迷惑,于是開始查閱底層源碼之旅。需要的朋友可以參考下2022-01-01
maven項(xiàng)目錯(cuò)誤:找不到或無法加載主類?XXX問題
這篇文章主要介紹了maven項(xiàng)目錯(cuò)誤:找不到或無法加載主類?XXX問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Java數(shù)組的特性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
數(shù)組是基本上所有語言都會(huì)有的一種數(shù)據(jù)類型,它表示一組相同類型的數(shù)據(jù)的集合,具有固定的長度,并且在內(nèi)存中占據(jù)連續(xù)的空間。在C,C++等語言中,數(shù)組的定義簡潔清晰,而在Java中確有一些會(huì)讓人迷惑的特性。本文就嘗試分析這些特性2017-04-04
spring?@Transactional注解中常用參數(shù)詳解
這篇文章主要介紹了spring?@Transactional注解中常用參數(shù)詳解,事物注解方式:?@Transactional,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報(bào)錯(cuò)兩種
這篇文章主要介紹了VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報(bào)錯(cuò)兩種解決辦法的相關(guān)資料,第一種在setting.json中配置使用新版本JDK運(yùn)行,第二種方法是切換至支持舊版本Jdk的插件版本,但不推薦,建議要確保使用最新JDK以避免兼容性問題,需要的朋友可以參考下2026-04-04
Mybatis-Plus updateById方法更新無效及空值處理過程
MyBatis-Plus的updateById默認(rèn)不更新null值以防止誤操作,可通過UpdateWrapper/LambdaUpdateWrapper顯式設(shè)置,或全局配置、注解@TableField允許字段更新為空,需根據(jù)業(yè)務(wù)場景選擇合適方式2025-07-07

