Technologieaustausch

Wie dekomprimiere ich Zip- und Rar-Dateien über Java?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Inhaltsverzeichnis

1. Verwendete Wissenspunkte

2. Codeanzeige (zerlegte Version)

3. Codeanzeige (Gesamtversion)


1. Verwendete Wissenspunkte

1.IO-Stream:

Eingabe: Eingabe, Dateien über den „Eingabestream“ lesen

Ausgabe: Ausgabe, Schreiben von Dateien über den „Ausgabestream“

2. Bezogen auf den Dateivorgang:

Dateiklasse: Wird zur Darstellung von Pfaden zu Dateien und Verzeichnissen verwendet.

FileInputStream und FileOutputStream: werden zum Lesen und Schreiben von Dateien verwendet.

3. Verarbeitung komprimierter Dateien:

ZipInputStream: Eingabestream zum Lesen von ZIP-komprimierten Dateien.

ZipEntry: Stellt einen Eintrag (Datei oder Verzeichnis) in einer ZIP-komprimierten Datei dar.

4. Ausnahmebehandlung:

FileNotFoundException: Wird ausgelöst, wenn versucht wird, auf eine nicht vorhandene Datei zuzugreifen.

IOException: Wird zur Behandlung allgemeiner Ausnahmen bei Eingabe- und Ausgabevorgängen verwendet.

RarException: Behandelt bestimmte Ausnahmen im Zusammenhang mit RAR-Archivierungsvorgängen.

5. Dateneingabe- und -ausgabeströme:

InputStream: Eingabestream zum Lesen von Daten.

6. Inkassotätigkeiten:

Liste: Eine Liste zum Speichern von Datei-Header-Informationen.

7. Vergleicher:Wird zum Sortieren der Datei-Header-Liste verwendet.

8. FileUtils-Klasse in der Drittanbieterbibliothek commons-io:(Dieses JAR-Paket befindet sich am Ende des Artikels)

Wird zum Löschen von Verzeichnissen und zum Kopieren von Eingabeströmen in Dateien verwendet.

2. Codeanzeige (zerlegte Version)

Schritt 1: Bestimmen Sie den Dateityp

  • Wenn es sich um eine „.zip“-Datei handelt, rufen Sie die Methode unzip() auf, um die ZIP-Datei zu dekomprimieren. Wenn es sich um eine „.rar“-Datei handelt, rufen Sie die Methode unrar() auf, um die RAR-Datei zu dekomprimieren.
  1. //指定文件夹
  2. String Path = “D:\...\xxxx.zip”
  3. String Path = “D:\...\xxxx.rar”
  4. }
  5. //1.判断文件类型
  6. if(path.endsWith(".zip")) {
  7. unzip(path);
  8. }else if(path.endsWith(".rar")) {
  9. unrar(path);
  10. }
  11. }

Schritt 2: Definieren Sie die unzip()-Methode

  • Erstellt ein Quelldateiobjekt basierend auf dem Eingabedateipfad.
  • Bestimmen Sie den Pfad des dekomprimierten Stammverzeichnisses und erstellen Sie das entsprechende Dateiobjekt.
  • Wenn das Stammverzeichnis bereits existiert, versuchen Sie es zu löschen (einschließlich der Verwendung vonFileUtilsDie Utility-Klasse löscht nicht leere Verzeichnisse) und erstellt dann das Stammverzeichnis neu.
  • Erstellen Sie einen Eingabestream zum Lesen des ZIP-Formats.
  • Durchlaufen Sie jeden Eintrag (Unterdatei oder Unterverzeichnis) im Archiv.
  • Erstellen Sie für jeden Eintrag ein entsprechendes Dateiobjekt.
  • Bestimmen Sie, ob es sich bei dem Eintrag um eine Unterdatei oder ein Unterverzeichnis handelt, und erstellen Sie die Datei bzw. das Verzeichnis.
  • Erstellen Sie für Unterdateien einen Ausgabestream, lesen Sie Daten aus dem Eingabestream und schreiben Sie in die Unterdatei.
  • Behandeln Sie mögliche nicht gefundene Dateien sowie Ein- und Ausgabeausnahmen.
  1. //2.解压缩zip格式
  2. public static void unzip(String path) {
  3. //(1)根据原始路径(字符串),创建源文件(File对象)
  4. File sourceFile = new File(path);
  5. //(2)根目录
  6. String sourceName = sourceFile.getName();
  7. File rootDir = new File(sourceFile.getParent()+"\"+sourceName.substring(0,sourceName.lastIndexOf(".")));
  8. //(3)判断根目录是否已经存在
  9. if(rootDir.exists()) {
  10. //若存在,则删除
  11. rootDir.delete();//只能删除空目录
  12. //使用commons-io包提供的FileUtils工具类进行删除
  13. try {
  14. FileUtils.deleteDirectory(rootDir);
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. //(4)创建根目录
  20. rootDir.mkdir();
  21. //(5)ZipInputStream:用于进行zip格式的压缩输入流
  22. try {
  23. ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));
  24. //(6)遍历压缩包中每个子文件子目录(zipEntry类型的对象)
  25. ZipEntry zipEntry = null;
  26. while((zipEntry = in.getNextEntry())!=null) {
  27. //(7)创建子文件子目录(File对象)
  28. File file = new File(rootDir.getPath()+"\"+zipEntry.getName());
  29. //(8)判断是子文件还是子目录(不是子目录就是子文件)
  30. if(zipEntry.isDirectory()) {
  31. //物理磁盘创建子目录
  32. file.mkdir();
  33. }else {
  34. //物理磁盘创建子文件
  35. file.createNewFile();
  36. //(9)子文件的写入
  37. //读取当前压缩包的子文件,并通过输出流out写入新子文件中
  38. try (FileOutputStream out = new FileOutputStream(file)) {
  39. byte[] buff = new byte[1024];
  40. int len = -1;
  41. while((len = in.read(buff))!=-1) {
  42. out.write(buff,0,len);
  43. }
  44. }
  45. }
  46. }
  47. } catch (FileNotFoundException e) {
  48. e.printStackTrace();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }

Schritt 3: Definieren Sie die unrar()-Methode

  • Erstellen Sie ein Dateiobjekt des Stammverzeichnisses basierend auf dem eingegebenen RAR-Dateipfad.
  • Stellen Sie fest, ob das Stammverzeichnis vorhanden ist, und versuchen Sie, es zu löschen, wenn es vorhanden ist (verwenden SieFileUtilsBehandeln Sie mögliche Ausnahmen) und erstellen Sie dann das Stammverzeichnis.
  • Erstellen Sie eine Datei zum Lesen von RAR-komprimierten DateienArchiveObjekt.
  • Holen Sie sich alle Unterverzeichnisse und Unterdateien in einer komprimierten DateiFileHeaderObjekt erfasst und in der Liste gespeichert.
  • Sortieren Sie die Liste nach den Namen der Unterverzeichnisse und Unterdateien.
  • Durchlaufen Sie jedes Element in der ListeFileHeaderObjekt.
  • entsprechendFileHeaderObjekt erstellt das entsprechende Dateiobjekt.
  • Stellen Sie fest, ob es sich um ein Unterverzeichnis oder eine Unterdatei handelt, und erstellen Sie das Verzeichnis bzw. die Datei.
  • Holen Sie sich für Unterdateien den Eingabestream und verwenden Sie ihnFileUtilsKopiert den Eingabestream in eine Unterdatei.
  • Behandeln Sie mögliche RAR-bezogene Ausnahmen sowie Eingabe- und Ausgabeausnahmen.
  1. //3.解压缩rar格式
  2. public static void unrar(String path) {
  3. //(1)创建解压缩的根目录
  4. File rarFile = new File(path);
  5. File rootDir = new File(rarFile.getParent()+"\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
  6. //(2)判断是否存在
  7. if(rootDir.exists()) {
  8. try {
  9. FileUtils.deleteDirectory(rootDir);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. rootDir.mkdir();
  15. //(3)创建Archive对象,用于读取rar压缩文件格式
  16. try (Archive archive = new Archive(new FileInputStream(path))){
  17. //(4)获取压缩文件所有子目录子文件(FileHeader对象)
  18. List<FileHeader> fileheaderList = archive.getFileHeaders();
  19. //(5)按照子目录(子文件)名称排序
  20. fileheaderList.sort(new Comparator<FileHeader>() {
  21. @Override
  22. public int compare(FileHeader o1, FileHeader o2) {
  23. return o1.getFileName().compareTo(o2.getFileName());
  24. }
  25. });
  26. //(6)遍历子目录子文件
  27. for(FileHeader fd : fileheaderList) {
  28. File f = new File(rootDir.getPath()+"\"+fd.getFileName());
  29. if(fd.isDirectory()) {
  30. //物理磁盘创建子目录
  31. f.mkdir();
  32. }else {
  33. //物理磁盘创建子文件
  34. f.createNewFile();
  35. //获取压缩包中子文件输入流
  36. InputStream in = archive.getInputStream(fd);
  37. //复制文件输入流至子文件
  38. FileUtils.copyInputStreamToFile(in, f);
  39. }
  40. }
  41. } catch (RarException | IOException e) {
  42. e.printStackTrace();
  43. }
  44. }

3. Codeanzeige (Gesamtversion)

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.Comparator;
  8. import java.util.List;
  9. import java.util.zip.ZipEntry;
  10. import java.util.zip.ZipInputStream;
  11. import org.apache.commons.io.FileUtils;
  12. import com.github.junrar.Archive;
  13. import com.github.junrar.exception.RarException;
  14. import com.github.junrar.rarfile.FileHeader;
  15. public class Test {
  16. //指定文件夹
  17. String Path = “D:\...\xxxx.zip”
  18. String Path = “D:\...\xxxx.rar”
  19. }
  20. //1.判断文件类型
  21. if(path.endsWith(".zip")) {
  22. unzip(path);
  23. }else if(path.endsWith(".rar")) {
  24. unrar(path);
  25. }
  26. }
  27. //2.解压缩zip格式
  28. public static void unzip(String path) {
  29. //(1)根据原始路径(字符串),创建源文件(File对象)
  30. File sourceFile = new File(path);
  31. //(2)根目录
  32. String sourceName = sourceFile.getName();
  33. File rootDir = new File(sourceFile.getParent()+"\"+sourceName.substring(0,sourceName.lastIndexOf(".")));
  34. //(3)判断根目录是否已经存在
  35. if(rootDir.exists()) {
  36. //若存在,则删除
  37. rootDir.delete();//只能删除空目录
  38. //使用commons-io包提供的FileUtils工具类进行删除
  39. try {
  40. FileUtils.deleteDirectory(rootDir);
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. //(4)创建根目录
  46. rootDir.mkdir();
  47. //(5)ZipInputStream:用于进行zip格式的压缩输入流
  48. try {
  49. ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));
  50. //(6)遍历压缩包中每个子文件子目录(zipEntry类型的对象)
  51. ZipEntry zipEntry = null;
  52. while((zipEntry = in.getNextEntry())!=null) {
  53. //(7)创建子文件子目录(File对象)
  54. File file = new File(rootDir.getPath()+"\"+zipEntry.getName());
  55. //(8)判断是子文件还是子目录(不是子目录就是子文件)
  56. if(zipEntry.isDirectory()) {
  57. //物理磁盘创建子目录
  58. file.mkdir();
  59. }else {
  60. //物理磁盘创建子文件
  61. file.createNewFile();
  62. //(9)子文件的写入
  63. //读取当前压缩包的子文件,并通过输出流out写入新子文件中
  64. try (FileOutputStream out = new FileOutputStream(file)) {
  65. byte[] buff = new byte[1024];
  66. int len = -1;
  67. while((len = in.read(buff))!=-1) {
  68. out.write(buff,0,len);
  69. }
  70. }
  71. }
  72. }
  73. } catch (FileNotFoundException e) {
  74. e.printStackTrace();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. //3.解压缩rar格式
  80. public static void unrar(String path) {
  81. //(1)创建解压缩的根目录
  82. File rarFile = new File(path);
  83. File rootDir = new File(rarFile.getParent()+"\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
  84. //(2)判断是否存在
  85. if(rootDir.exists()) {
  86. try {
  87. FileUtils.deleteDirectory(rootDir);
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. rootDir.mkdir();
  93. //(3)创建Archive对象,用于读取rar压缩文件格式
  94. try (Archive archive = new Archive(new FileInputStream(path))){
  95. //(4)获取压缩文件所有子目录子文件(FileHeader对象)
  96. List<FileHeader> fileheaderList = archive.getFileHeaders();
  97. //(5)按照子目录(子文件)名称排序
  98. fileheaderList.sort(new Comparator<FileHeader>() {
  99. @Override
  100. public int compare(FileHeader o1, FileHeader o2) {
  101. return o1.getFileName().compareTo(o2.getFileName());
  102. }
  103. });
  104. //(6)遍历子目录子文件
  105. for(FileHeader fd : fileheaderList) {
  106. File f = new File(rootDir.getPath()+"\"+fd.getFileName());
  107. if(fd.isDirectory()) {
  108. //物理磁盘创建子目录
  109. f.mkdir();
  110. }else {
  111. //物理磁盘创建子文件
  112. f.createNewFile();
  113. //获取压缩包中子文件输入流
  114. InputStream in = archive.getInputStream(fd);
  115. //复制文件输入流至子文件
  116. FileUtils.copyInputStreamToFile(in, f);
  117. }
  118. }
  119. } catch (RarException | IOException e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. }

4. Nutzungsszenarien

Das Obige bietet Dekomprimierungsfunktionen für Dateien in zwei gängigen Komprimierungsformaten (ZIP und RAR). Rufen Sie anhand der Beurteilung des Formats der Eingabedatei (entsprechend der Dateierweiterung) die entsprechende Dekomprimierungsmethode auf (unzipoderunrar), kann den Inhalt der komprimierten Datei korrekt in das angegebene Verzeichnis dekomprimieren.

Diese Funktion ist in vielen Szenarien sehr nützlich, wie zum Beispiel:

  1. Datenverarbeitung und -analyse: Wenn Daten in komprimierter Form erhalten werden, müssen sie dekomprimiert werden, um die Originaldaten zur Verarbeitung und Analyse zu erhalten.
  2. Dateiübertragung und -speicherung: Während der Dateiübertragung oder -speicherung kann durch Komprimierung Platz gespart und die Übertragungseffizienz verbessert werden. Nach Erreichen des Ziels wird dann dekomprimiert, um die ursprüngliche Dateistruktur wiederherzustellen.
  3. Softwareentwicklung: Während des Entwicklungsprozesses kann es erforderlich sein, komprimierte Dateiressourcen aus verschiedenen Quellen zu verarbeiten und zu integrieren.

Insgesamt bietet dieser Code eine flexible und wiederverwendbare Möglichkeit, die Dekomprimierungsvorgänge von ZIP- und RAR-komprimierten Dateien zu handhaben und erfüllt so die Anforderungen der Verarbeitung komprimierter Dateien in verschiedenen Anwendungen.