ZipOutputStream中报错System Closed

对于生成zip文件,一般在第二次putNextEntry时会报错:System closed,原因是一般的流都会自动调用close()方法,关闭流,所以在第二次调用putNextEntry时会因为流被关闭报错。有两种解决办法:

1、用OutputStreamWriter包装一下,并且重写close方法;

2、将流放入到ByteArrayOutputStream 内存中,这样就不会close了

ZipInputStream同理

OutputStreamWriter包装:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

OutputStreamWriter包装:

Path path = Paths.get("target/output/jackson/Jackson.zip");

try {

    Files.createDirectories(path.getParent());

} catch (IOException e) {

    e.printStackTrace();

}

try(

        OutputStream out = new FileOutputStream(path.toFile());

        ZipOutputStream zo = new ZipOutputStream(out);

        ){

    for (Map.Entry<String, Object> e: map.entrySet()) {

        zo.putNextEntry(new ZipEntry(e.getKey()));

        objectMapper.writeValue(new OutputStreamWriter(zo, "UTF-8"){

            @Override

            public void close() throws IOException {

                flush();

            }

        }, e.getValue());

        System.out.println("生成成功:"+e.getKey());

    }

   

} catch (FileNotFoundException e) {

    e.printStackTrace();

} catch (IOException e) {

    e.printStackTrace();

}

ByteArrayOutputStream 包装:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

 

Path path = Paths.get("target/output/jackson/Jackson.zip");

try {

    Files.createDirectories(path.getParent());

} catch (IOException e) {

    e.printStackTrace();

}

try(

        OutputStream out = new FileOutputStream(path.toFile());

        ZipOutputStream zo = new ZipOutputStream(out);

){

    for (Map.Entry<String, Object> e: map.entrySet()) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        zo.putNextEntry(new ZipEntry(e.getKey()));

        objectMapper.writeValue(baos, e.getValue());

        baos.writeTo(zo);

        baos.close();

        System.out.println("生成成功:"+e.getKey());

    }

   

} catch (FileNotFoundException e) {

    e.printStackTrace();

} catch (IOException e) {

    e.printStackTrace();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SenKnight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值