7-zip-JBinding用于解压缩文件的用法

时间:2015-10-14 12:16:44

标签: java unzip 7zip

我使用下面的java代码解压缩.gz文件。 .gz文件包含文件夹/ textFile。只有文本文件中有一些数据才能正常工作。即使文本文件中没有数据,我也需要它才能工作。帮助我修改下面的java代码。

public static void main(String[] args) {
    String sourceZipFile = "C:/SKKIKRFULL20151014.gz";
    final String destinationDir = "C:/";
    RandomAccessFile randomAccessFile = null;
    ISevenZipInArchive inArchive = null;
    try {
        randomAccessFile = new RandomAccessFile(sourceZipFile, "r");
        inArchive = SevenZip.openInArchive(null, // autodetect archive type
                new RandomAccessFileInStream(randomAccessFile));

        // Getting simple interface of the archive inArchive
        ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();

        for (final ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {

            final int[] hash = new int[] { 0 };

            if (!item.isFolder()) {

                ExtractOperationResult result;
                result = item.extractSlow(new ISequentialOutStream() {

                    public int write(final byte[] data) throws SevenZipException {
                        try {

                            if (item.getPath().indexOf(File.separator) > 0) {

                                String path = destinationDir + File.separator
                                        + item.getPath().substring(0, item.getPath().lastIndexOf(File.separator));

                                File folderExisting = new File(path);

                                if (!folderExisting.exists()) {

                                    new File(path).mkdirs();
                                }
                            }
                            OutputStream out = new FileOutputStream(
                                    destinationDir + File.separator + item.getPath());

                            out.write(data);
                            out.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        hash[0] |= Arrays.hashCode(data);
                        return data.length; // Return amount of proceed data
                    }
                }); 
                if (result == ExtractOperationResult.OK) {
                    System.out.println(String.format("%9X | %s", hash[0], item.getPath()));
                } else {
                    System.err.println("Error extracting item: " + result);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (inArchive != null) {
            try {
                inArchive.close();
            } catch (SevenZipException e) {
                System.err.println("Error closing archive: " + e);
                e.printStackTrace();
            }
        }
        if (randomAccessFile != null) {
            try {
                randomAccessFile.close();
            } catch (IOException e) {
                System.err.println("Error closing file: " + e);
                e.printStackTrace();
            }
        }
    }
}

我调试了它。它没有进入下面的区块。

 result = item.extractSlow(new ISequentialOutStream() {//write() method})

想知道如何修改代码以使其正常工作。

1 个答案:

答案 0 :(得分:2)

如果有效负载大于0字节,则代码只会创建一个文件。我相信这是因为ISequentialOutStream写(byte []数据) - 方法只在数组大于0字节时写入。来自javadocs:

  

将数据字节数组写入流。如果data.length> 0此函数必须写入至少1个字节。

您应该更改write() - 方法代码以允许创建空文件。 也许这会有所帮助:Stackoverflow: decompress files with .7z extension in java