我使用下面的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})
想知道如何修改代码以使其正常工作。
答案 0 :(得分:2)
如果有效负载大于0字节,则代码只会创建一个文件。我相信这是因为ISequentialOutStream写(byte []数据) - 方法只在数组大于0字节时写入。来自javadocs:
将数据字节数组写入流。如果data.length> 0此函数必须写入至少1个字节。
您应该更改write() - 方法代码以允许创建空文件。 也许这会有所帮助:Stackoverflow: decompress files with .7z extension in java