java.io.IOException: ストリームが閉じられました [response.body().byteStream() ダウンロード ストリームの複数使用の問題が解決されました]

質問

ダウンロード アドレスを呼び出した後、応答オブジェクトが返され、エラーが直接 response.body().byteStream() オペレーションに何度も報告されます。

理由

InputStream ストリームは 1 回しか使用できません。読み込み後は無効になります。2 回目以降に使用すると、java.io.IOException: Stream Closed 例外が報告されます。

プラン

したがって、ダウンロードによって返されたストリームは、最初に出力ストリームとしてコピーされ、その後ビジネスで複数回使用される必要があります。

// 将下载文件流缓存一份至内存,供业务多次使用
ByteArrayOutputStream cacheOutStream = new ByteArrayOutputStream();
try {
    
    
  IOUtils.copy(body.byteStream(), cacheOutStream);
} catch (IOException e) {
    
    
  log.error("缓存下载文件流异常", e);
  throw new FormException("缓存下载文件流异常", ServiceResponseStatus.BUSINESS_ERROR);
}

// 业务1:将文件保存至指定服务器
try (ByteArrayInputStream bis = new ByteArrayInputStream(cacheOutStream.toByteArray())) {
    
    
  mosFileOperator.uploadFile(bis, "zip");
  log.debug("文件上传至mos成功 url: {} , mos-url: {}", url, mosUrl);
} catch (IOException e) {
    
    
  log.error("文件上传至mos失败 url: {}", url, e);
  throw new FormException("文件上传至mos失败", ServiceResponseStatus.BUSINESS_ERROR);
}

// 业务2:文件解压解析落库
try (ZipInputStream in =
    new ZipInputStream(
        new ByteArrayInputStream(cacheOutStream.toByteArray()), Charset.forName("GBK"))) {
    
    
  ZipEntry zipEntry;
  
  // ...

  in.closeEntry();
} catch (IOException e) {
    
    
  log.error("文件解压失败 url: {}", url, e);
  throw new FormException("文件解压失败", ServiceResponseStatus.BUSINESS_ERROR);
}

おすすめ

転載: blog.csdn.net/ZHAI_KE/article/details/128002289