使用 java 提取.rar文件

2022-09-03 01:13:19

我正在寻找一种使用Java解压缩文件的方法,无论我在哪里搜索,我都会以相同的工具结束 - .我一直在研究用这个解压缩文件,但我似乎发现这样做的所有方法都非常长且尴尬,就像这个例子一样。.rarJavaUnRar.rar

我目前能够以20行或更少的代码提取,和文件,所以必须有更简单的方法来提取文件,有人知道吗?.tar.tar.gz.zip.jar.rar

只是如果它帮助任何人,这就是我用来提取和文件的代码,它适用于两者.zip.jar

 public void getZipFiles(String zipFile, String destFolder) throws IOException {
    BufferedOutputStream dest = null;
    ZipInputStream zis = new ZipInputStream(
                                       new BufferedInputStream(
                                             new FileInputStream(zipFile)));
    ZipEntry entry;
    while (( entry = zis.getNextEntry() ) != null) {
        System.out.println( "Extracting: " + entry.getName() );
        int count;
        byte data[] = new byte[BUFFER];

        if (entry.isDirectory()) {
            new File( destFolder + "/" + entry.getName() ).mkdirs();
            continue;
        } else {
            int di = entry.getName().lastIndexOf( '/' );
            if (di != -1) {
                new File( destFolder + "/" + entry.getName()
                                             .substring( 0, di ) ).mkdirs();
            }
        }
        FileOutputStream fos = new FileOutputStream( destFolder + "/"
                                                     + entry.getName() );
        dest = new BufferedOutputStream( fos );
        while (( count = zis.read( data ) ) != -1) 
            dest.write( data, 0, count );
        dest.flush();
        dest.close();
    }
}

答案 1

您可以提取 、、文件,因为它们使用 Java SDK 中内置的压缩算法的数量。.gz.zip.jar

RAR格式的情况略有不同。RAR是一种专有的存档文件格式。RAR许可证不允许将其包含在Java SDK等软件开发工具中。

取消文件的最佳方法是使用第三方库,例如junrar

你可以在 SO question RAR archives with java 中找到一些对其他 Java RAR 库的引用。另外 SO问题 如何使用java程序将文本文件压缩为稀有格式,并详细解释了不同的解决方法(例如使用)。Runtime


答案 2

您可以使用该库junrar

<dependency>
   <groupId>com.github.junrar</groupId>
   <artifactId>junrar</artifactId>
   <version>0.7</version>
</dependency>

代码示例:

            File f = new File(filename);
            Archive archive = new Archive(f);
            archive.getMainHeader().print();
            FileHeader fh = archive.nextFileHeader();
            while(fh!=null){        
                    File fileEntry = new File(fh.getFileNameString().trim());
                    System.out.println(fileEntry.getAbsolutePath());
                    FileOutputStream os = new FileOutputStream(fileEntry);
                    archive.extractFile(fh, os);
                    os.close();
                    fh=archive.nextFileHeader();
            }