首先,关于你现在遇到的问题,sevenzipjbinding库本身支持设置字符编码,但是API比较隐蔽,使用起来不太方便,并且 sevenzipjbinding 这个库的更新已经比较少了,可能在某些特殊的压缩格式处理上可能存在问题。
解决你的问题的一个备选方案是可以使用Apache Commons Compress库。Apache Commons Compress 库支持很多压缩和归档格式,如7z,ar,arj,bz2,cpio,dump,gz,jar,lzma,pack200,rar, tar, xz 和 zip。对应的编码处理也比较成熟。
以下代码演示了如何使用 Apache Commons Compress 解压 7z 文件,假设我们有一个名为 example.7z 的归档文件:
import org.apache.commons.compress.archivers.sevenz.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
SevenZFile sevenZFile = new SevenZFile(new File("example.7z"));
SevenZArchiveEntry entry = sevenZFile.getNextEntry();
while(entry != null){
System.out.println(entry.getName());
FileOutputStream out = new FileOutputStream(entry.getName());
byte[] content = new byte[(int) entry.getSize()];
sevenZFile.read(content, 0, content.length);
out.write(content);
out.close();
entry = sevenZFile.getNextEntry();
}
sevenZFile.close();
}
}
这段代码将获取归档文件的每一个条目,并写入到当前目录下的同名文件。注意,如果你的文档中的文件有目录结构,你需要确保在解压之前,这些目录已经存在,否则你可能会遇到问题。
至于编码问题,虽然Commons Compress没有提供直接转换编码的API,但可以通过Java的String来进行转换。下面是一个例子:
String unicodeName = new String(entry.getName().getBytes("GBK"), "UTF-8");
这行代码将会获取每一个压缩条目的名字,并将其从GBK转为UTF-8编码,然后你可以用转换后的名字来创建文件。
最后的密码问题,由于7z的加密标准和zip等其他格式不一样(7z使用的是AES-256加密),现阶段Apache Commons Compress还不支持处理7z的密码保护。不过鉴于Apache Commons Compress的强大和灵活,它仍是一个值得考虑的选择。如果你有处理7z密码保护的需求,可能需要寻找其它的方案了。