我想将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并进行打印,而无需生成或读取新文件吗?
答案 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
而不是FileInputStream
。 ByteArrayInputStream
必须使用与字符串对应的字节进行初始化。
有关如何进行此转换的示例,请参见以下文章:
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
的实现必须由字节数组或各种排序流支持。您可以使用以下实现:
从文件以外的其他文件中获取SevenZArchiveEntry
:
尽管SevenZOutputFile
类似乎没有提供执行此操作的功能,但是如果您查看其源代码,则会注意到您可以手动创建SevenZArchiveEntry
,而无需任何中介,因为它有一个空的构造函数。您必须“假装”它仍然是实际文件,但这不应该成为问题。
SevenZArchiveEntry
的源代码: