7-Zip-JBinding-4Android
7-Zip-JBinding-4Android copied to clipboard
Decompressing large files such as 5.9GB, the decompression speed is gradually abnormally slow
Decompressing large files such as 5.9GB, the decompression speed is gradually abnormally slow
The decompression speed of 7-Zip-JBinding-4Android is directly dependent to the implementations of the underlying 7-Zip-JBinding and 7-Zip libraries.
However, you would want to ensure that you are using IInArchive.extract() rather than IInArchive.extractSlow()
. Also, you may want to consider extracting in-memory, to the extent possible. As an example, something like the following.
void extract(File file) {
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
RandomAccessFileInStream inStream = new RandomAccessFileInStream(randomAccessFile);
IInArchive inArchive = SevenZip.openInArchive(null, inStream);
List<MyData> data = new ArrayList<>();
ArchiveExtractCallback extractCallback = new ArchiveExtractCallback(data);
inArchive.extract(null, false, extractCallback);
} catch (SevenZipException e) {
}
}
private class ArchiveExtractCallback implements IArchiveExtractCallback {
private List<MyData> mData;
ArchiveExtractCallback(IInArchive inArchive, List<MyData> data) {
mData = data;
}
@Override
public ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException {
SequentialOutStream stream = new SequentialOutStream(mData);
return stream;
}
@Override
public void prepareOperation(ExtractAskMode extractAskMode) throws SevenZipException {
}
@Override
public void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException {
if (extractOperationResult != ExtractOperationResult.OK) {
throw new SevenZipException(extractOperationResult.toString());
}
}
@Override
public void setTotal(long total) throws SevenZipException {
}
@Override
public void setCompleted(long complete) throws SevenZipException {
}
}
private class SequentialOutStream implements ISequentialOutStream {
private List<MyData> mData;
SequentialOutStream(List<MyData> data) {
mData = data;
}
@Override
public int write(byte[] data) throws SevenZipException {
if (data == null) {
throw new SevenZipException("null data");
}
mData.add(data);
return data.length;
}
}