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ā)送響應(yīng)。在finally塊中不需要關(guān)閉輸出流,因為Servlet容器會在請求處理完成后自動關(guān)閉輸出流。如果在finally塊中嘗試關(guān)閉已關(guān)閉的輸出流,就會拋出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 { // 清空下載文件的空白行(空白行是因為有的前端代碼編譯后產(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報錯Failed?to?parse?multipart?servlet?request;?nested?exception?is?java.io.IOException問題
- 什么情況下會出現(xiàn)java.io.IOException?:?Broken?pipe這個錯誤以及解決辦法
- 解決Spring調(diào)用Feign報錯:java.io.IOException:Incomplete output stream問題
- Android創(chuàng)建文件時出現(xiàn)java.io.IOException:?Operation?not?permitted異常的解決方法
- java.io.IOException:你的主機(jī)中的軟件中止了一個已建立的連接踩坑實戰(zhàn)
- 解決Java中的java.io.IOException: Broken pipe問題
- AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法
- JSP上傳圖片產(chǎn)生 java.io.IOException: Stream closed異常解決方法
- Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111
相關(guān)文章
java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例
Map在日常開發(fā)應(yīng)用中的頻率很高,最常用的實現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關(guān)于java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例,需要的朋友可以參考下2024-01-01Java使用JDBC驅(qū)動連接MySQL數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了Java使用JDBC驅(qū)動連接MySQL數(shù)據(jù)庫的具體步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12springboot中PostMapping正常接收json參數(shù)后返回404問題
這篇文章主要介紹了springboot中PostMapping正常接收json參數(shù)后返回404問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Spring Security 強(qiáng)制退出指定用戶的方法
本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03mybatis-spring:@MapperScan注解的使用
這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09