Teknologian jakaminen

Kuinka purkaa zip-tiedostot ja rar-tiedostot Javan kautta?

2024-07-12

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

Sisällysluettelo

1. Käytetyt tietopisteet

2. Koodinäyttö (hajotettu versio)

3. Koodinäyttö (kokonaisversio)


1. Käytetyt tietopisteet

1.IO-stream:

Syöttö: syöttö, lue tiedostot "syöttövirran" kautta

Tulostus: Tulosta, kirjoita tiedostoja "lähtövirran" kautta

2. Tiedostotoimintoihin liittyvä:

Tiedostoluokka: käytetään edustamaan tiedostojen ja hakemistojen polkuja.

FileInputStream ja FileOutputStream: käytetään tiedostojen lukemiseen ja kirjoittamiseen.

3. Pakatun tiedoston käsittely:

ZipInputStream: Syöttövirta ZIP-pakkattujen tiedostojen lukemiseen.

ZipEntry: Edustaa merkintää (tiedostoa tai hakemistoa) ZIP-pakkatussa tiedostossa.

4. Poikkeuskäsittely:

FileNotFoundException: Heitetään, kun yritetään käyttää tiedostoa, jota ei ole olemassa.

IOException: käytetään käsittelemään yleisiä poikkeuksia syöttö- ja lähtöoperaatioissa.

RarException: Käsittelee erityisiä RAR-arkistointitoimintoihin liittyviä poikkeuksia.

5. Tietojen syöttö- ja lähtövirrat:

InputStream: Syöttövirta tietojen lukemiseen.

6. Keräystoiminnot:

Lista: Luettelo, jota käytetään tiedoston otsikkotietojen tallentamiseen.

7. Vertailu:Käytetään tiedostojen otsikkoluettelon lajitteluun.

8. FileUtils-luokka kolmannen osapuolen kirjastossa commons-io:(Tämä purkkipaketti on artikkelin lopussa)

Käytetään hakemistojen poistamiseen ja syöttövirtojen kopioimiseen tiedostoihin.

2. Koodinäyttö (hajotettu versio)

Vaihe 1: Määritä tiedostotyyppi

  • Jos se on ".zip"-tiedosto, pura ZIP-tiedosto kutsumalla unzip()-menetelmää.
  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. }

Vaihe 2: Määritä unzip()-menetelmä

  • Luo lähdetiedostoobjektin syöttötiedoston polun perusteella.
  • Määritä puretun juurihakemiston polku ja luo vastaava tiedostoobjekti.
  • Jos juurihakemisto on jo olemassa, yritä poistaa se (mukaan lukienFileUtilsApuohjelmaluokka poistaa ei-tyhjät hakemistot) ja luo sitten juurihakemiston uudelleen.
  • Luo syöttövirta ZIP-muodossa lukemista varten.
  • Iteroi jokaisen arkiston merkinnän (alitiedoston tai alihakemiston) läpi.
  • Luo jokaiselle merkinnälle vastaava tiedostoobjekti.
  • Määritä, onko merkintä alitiedosto vai alihakemisto, ja luo tiedosto tai hakemisto vastaavasti.
  • Luo alitiedostoille lähtövirta, lue tiedot tulovirrasta ja kirjoita alitiedostoon.
  • Käsittele mahdollista tiedostoa ei löydy sekä syöttö- ja tulostuspoikkeuksia.
  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. }

Vaihe 3: Määritä unrar()-metodi

  • Luo juurihakemiston tiedostoobjekti syötetyn RAR-tiedostopolun perusteella.
  • Selvitä, onko juurihakemisto olemassa, ja jos se on olemassa, yritä poistaa se (käytäFileUtilskäsittele mahdollisia poikkeuksia) ja luo sitten juurihakemisto.
  • Luo tiedosto RAR-pakkattujen tiedostojen lukemista vartenArchiveesine.
  • Hanki kaikki alihakemistot ja alitiedostot pakatussa tiedostossaFileHeaderobjekti ja tallennetaan luetteloon.
  • Lajittele luettelo alihakemistojen ja alitiedostojen nimien mukaan.
  • Toista luettelon jokainen kohtaFileHeaderesine.
  • mukaanFileHeaderObjekti luo vastaavan tiedostoobjektin.
  • Määritä, onko se alihakemisto vai alitiedosto, ja luo vastaava hakemisto tai tiedosto.
  • Alatiedostoille hanki syöttövirta ja käytäFileUtilsKopioi syöttövirran alitiedostoon.
  • Käsittele mahdollisia RAR:iin liittyviä poikkeuksia sekä tulo- ja lähtöpoikkeuksia.
  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. Koodinäyttö (kokonaisversio)

  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. Käyttöskenaariot

Yllä oleva tarjoaa purkutoiminnot tiedostoille kahdessa yleisessä pakkausmuodossa (ZIP ja RAR). Arvioimalla syöttötiedoston muodon (tiedostotunnisteen mukaan) kutsu vastaava purkumenetelmä (unziptaiunrar), voi purkaa pakatun tiedoston sisällön oikein määritettyyn hakemistoon.

Tämä ominaisuus on erittäin hyödyllinen monissa tilanteissa, kuten:

  1. Tietojen käsittely ja analysointi: Kun tietoja saadaan pakatussa muodossa, se on purettava alkuperäisen datan saamiseksi käsittelyä ja analysointia varten.
  2. Tiedoston siirto ja tallennus: Tiedoston siirron tai tallennuksen aikana pakkaus voi säästää tilaa ja parantaa siirtotehokkuutta. Pura sitten tiedosto alkuperäisen rakenteen palauttamiseksi määränpäähän saapumisen jälkeen.
  3. Ohjelmistokehitys: Kehitysprosessin aikana saattaa olla tarpeen käsitellä ja integroida pakatut tiedostoresurssit eri lähteistä.

Kaiken kaikkiaan tämä koodi tarjoaa joustavan ja uudelleen käytettävän tavan käsitellä ZIP- ja RAR-pakkattujen tiedostojen purkutoimintoja, mikä täyttää pakattujen tiedostojen käsittelytarpeet eri sovelluksissa.