Java 7zip压缩字符串

时间:2019-05-29 14:57:43

标签: java 7zip

我想将Java中手动定义的String压缩为7z。因此,我可以将其转换为base64。我发现了很多将文件压缩到7z然后保存到新文件中的示例。

我只尝试下一个代码,它将正确地获取文件并进行压缩:

private static void addToArchiveCompression(SevenZOutputFile out, File file, String dir) throws IOException {
        String name = dir + File.separator + file.getName();
        if (file.isFile()){
            SevenZArchiveEntry entry = out.createArchiveEntry(file, name);
            out.putArchiveEntry(entry);

            FileInputStream in = new FileInputStream(file);
            byte[] b = new byte[1024];
            int count = 0;
            while ((count = in.read(b)) > 0) {
                out.write(b, 0, count);
            }
            out.closeArchiveEntry();

        } else if (file.isDirectory()) {
            File[] children = file.listFiles();
            if (children != null){
                for (File child : children){
                    addToArchiveCompression(out, child, name);
                }
            }
        } else {
            System.out.println(file.getName() + " is not supported");
        }
    }  

但是如何将手动定义的String压缩为7z并将其转换为byte []?因此,我可以将byte []转换为base64并进行打印,而无需生成或读取新文件吗?

2 个答案:

答案 0 :(得分:4)

由于您已经在使用commons-compress进行7zip压缩,因此可以使用SeekableInMemoryByteChannel创建一个包裹字节数组的SevenZOutputFile(SeekableByteChannel)实例。按照javadoc:

  

一个SeekableByteChannel实现,该实现包装一个字节[]。

     

当此通道用于写入时,内部缓冲区会增长以容纳传入的数据。自然大小限制是Integer.MAX_VALUE的值。可以通过array()访问内部缓冲区。

类似的东西:

SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(new byte[1024]);
SevenZOutputFile out = new SevenZOutputFile(channel);
// modified addToArchiveCompression(out, ...); for String
// encode channel.array() to Base64

答案 1 :(得分:0)

您当然必须对发布的代码进行一些更改。该代码用于压缩文件或目录,而您的情况要简单得多。例如,您绝对不需要for循环。

我将分解您需要研究的各个部分,并将编码留给您。

将字符串转换为7z的数据:

其中一种选择是使用ByteArrayInputStream而不是FileInputStreamByteArrayInputStream必须使用与字符串对应的字节进行初始化。

有关如何进行此转换的示例,请参见以下文章:

https://www.baeldung.com/convert-string-to-input-stream

将输出字节转换为Base64:

有几种方法,在StackOverflow线程中有详细介绍:

How do I convert a byte array to Base64 in Java?

将7z输出到内存而不是文件:

您将必须使用SevenZOutputFile构造函数,并以SeekableByteChannel接口作为输入。 SeekableByteChannel的实现必须由字节数组或各种排序流支持。您可以使用以下实现:

https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/utils/SeekableInMemoryByteChannel.html

从文件以外的其他文件中获取SevenZArchiveEntry

尽管SevenZOutputFile类似乎没有提供执行此操作的功能,但是如果您查看其源代码,则会注意到您可以手动创建SevenZArchiveEntry,而无需任何中介,因为它有一个空的构造函数。您必须“假装”它仍然是实际文件,但这不应该成为问题。

SevenZArchiveEntry的源代码:

https://commons.apache.org/proper/commons-compress/apidocs/src-html/org/apache/commons/compress/archivers/sevenz/SevenZOutputFile.html