通过InputStream在内存里生成压缩文件,不用落地

有时候我们需要在内存里直接对InputStream进行压缩,而不用在磁盘生成压缩文件。

import部分:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

代码:

    public static void main(String[] args) {
        String str = "你好!现在在测试通过inputstream生成压缩文件"; //文件的内容
        InputStream input = new ByteArrayInputStream(str.getBytes()); // String 对inputStream的转换
        // 在内存生成压缩文件
        compressFileOnMemoryByInputStream(input);
    }

        public static void compressFileOnMemoryByInputStream(InputStream input) {
        
        ZipOutputStream zipOS = null;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] byteBuffer = new byte[1024 * 4];
        zipOS = new ZipOutputStream(output);
        try {
            zipOS.putNextEntry(new ZipEntry("testFile001")); // 这个是压缩包里子文件的名字,必要有
            int n = 0;
            while (-1 != (n = input.read(byteBuffer))) {
                zipOS.write(byteBuffer, 0, n);
            }
                     
            // 下面这句很重要,没有这句无法打开压缩包
            zipOS.finish();

            
            // 额外的,我们可以对整个压缩包进行base64转码,传给前端
            String base64Archive = Base64.getEncoder().encodeToString(output.toByteArray());
            System.out.println("base64Archive=" + base64Archive);

            
            // TODO 把压缩文件写到磁盘中测试是否正确
            String pathStr = "E:\\Test_JAVAProgram\\test7z\\archive\\test_File.zip";
            Path path = Paths.get(pathStr);
            Files.write(path, output.toByteArray());

            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                zipOS.closeEntry(); // 关闭entry
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (zipOS != null) {
                try {
                    zipOS.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (output != null) {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_42488909/article/details/113859375