Я написал ниже программу для извлечения архивных файлов.Хотя он работает как требуется, я хотел бы получить ваши советы о возможных способах повышения его производительности и снижения сложности кода, или же можно достичь результатов гораздо более простым способом.
Кроме того, в commonExtracterМожно ли вместо создания каталогов периодически создавать временные папки для выполнения той же работы?Последний шаг должен быть похож на создание каталога и размещение в нем распакованной временной папки.
public class ExtractAllArchives {
public static void main(String[] args) {
File archiveFileLocation = new File("C:\\ZIP\\Sample.tar.gz");
// File archiveFileLocation = new File("C:\\ZIP\\Root.zip");
File destination = null;
try {
destination = new File(archiveFileLocation.getParent() + File.separator
+ FilenameUtils.getBaseName(archiveFileLocation.getName()));
if (destination.exists()) {
FileUtils.deleteDirectory(destination);
}
destination.mkdir();
} catch (IOException e) {
e.printStackTrace();
}
String fileExtn = FilenameUtils.getExtension(archiveFileLocation.getAbsolutePath());
String outputFolder = destination.getAbsolutePath();
switch (fileExtn) {
case "gz":
try (TarArchiveInputStream ais = new TarArchiveInputStream(
new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(archiveFileLocation))))) {
commonExtracter(ArchiveStreamFactory.TAR, ais, outputFolder);
} catch (Exception e1) {
e1.printStackTrace();
}
break;
case "zip":
try (ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.ZIP,
new FileInputStream(archiveFileLocation))) {
commonExtracter(ArchiveStreamFactory.ZIP, ais, outputFolder);
} catch (Exception e1) {
e1.printStackTrace();
}
break;
default:
System.out.println("No archive extractor found");
}
System.out.println("File extraction completed");
}
private static void commonExtracter(String archiveName, ArchiveInputStream ais, String outputFolder) {
ArchiveEntry entry = null;
try {
while ((entry = ais.getNextEntry()) != null) {
String filePath = outputFolder + File.separator + entry.getName();
Path fileLoc = Paths.get(filePath);
if (entry.isDirectory()) {
new File(filePath).mkdirs();
} else {
try (OutputStream bos = Files.newOutputStream(fileLoc)) {
IOUtils.copy(ais, bos);
} catch (Exception e) {
System.out.println("Failed to create the output file");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
Any help on this topic is much appreciated.
Thank you.