stream 在 java.base/java.io.fileinputstream.readbytes 处关闭(本地方法)

问题描述 投票:0回答:0

我正面临流关闭异常:当我有多个文件要处理时会触发该行为。

      try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            ZipOutputStream zipOut = new ZipOutputStream(out);
            ...
            for (FileDto fileDto : listePdfFiles) {
                String fileBaseName = FilenameUtils.getBaseName(fileDto.getName());
                String fileExtension = "." + FilenameUtils.getExtension(fileDto.getName());
                if (duplicateFileName.containsKey(fileDto.getName())) {
                    if (duplicateFileName.get(fileDto.getName()) > 0) {
                        fileBaseName += "(" + duplicateFileName.get(fileDto.getName()) + ")";
                    }
                    duplicateFileName.put(fileDto.getName(),               duplicateFileName.get(fileDto.getName()) + 1);
                }
                ZipEntry zipEntry = new ZipEntry(fileBaseName + fileExtension);
                zipOut.putNextEntry(zipEntry);

                byte[] bytes = new byte[1024];
                int length;
                while ((length = fileDto.getContent().read(bytes)) >= 0) {
                    zipOut.write(bytes, 0, length);
                }
            }
            zipOut.closeEntry();
            zipOut.close();
            String random = String.format("%s", RandomStringUtils.randomAlphanumeric(8));
            try(InputStream archive = new ByteArrayInputStream(out.toByteArray())) {
            return FileDto.builder().content(archive)
                    ...
            }
        } catch (Exception e) {
            log.error("Exporting report to PDF error: ", e);
        }

我调试了流程:第一个文件处理成功,但是在'(length = fileDto.getContent().read(bytes)'处忽略了第二个文件,没有对第二个文件进行任何处理,导致400错误。

我通过添加一个 try-catch 来处理异常来稍微调整代码,结果,可以下载包含两个文件的 zip 文件,但是第二个文件损坏了。

java spring-boot java-stream inputstream
© www.soinside.com 2019 - 2024. All rights reserved.