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
相關文章
springboot中PostMapping正常接收json參數后返回404問題
這篇文章主要介紹了springboot中PostMapping正常接收json參數后返回404問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
mybatis-spring:@MapperScan注解的使用
這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

