प्रौद्योगिकी साझेदारी

जावा मार्गेण zip सञ्चिकाः rar सञ्चिकाः च कथं विसंपीडयितुं शक्यन्ते?

2024-07-12

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

विषयवस्तुसारणी

1. प्रयुक्ताः ज्ञानबिन्दवः

2. कोडप्रदर्शनम् (विघटितसंस्करणम्) .

3. कोडप्रदर्शनम् (समग्रं संस्करणम्) .


1. प्रयुक्ताः ज्ञानबिन्दवः

1.IO धारा: 1.1.

Input: input, "input stream" इत्यस्य माध्यमेन सञ्चिकाः पठन्तु।

आउटपुट् : आउटपुट्, "output stream" इत्यस्य माध्यमेन सञ्चिकाः लिखन्तु ।

2. सञ्चिकासञ्चालनम् सम्बद्धम् : १.

सञ्चिकावर्गः : सञ्चिकानां निर्देशिकानां च मार्गाणां प्रतिनिधित्वार्थं उपयुज्यते ।

FileInputStream तथा FileOutputStream: सञ्चिकाः पठितुं लेखितुं च उपयुज्यन्ते ।

3. संपीडितसञ्चिकासंसाधनम् : १.

ZipInputStream: ZIP संपीडितसञ्चिकानां पठनार्थं निवेशप्रवाहः ।

ZipEntry: ZIP संपीडितसञ्चिकायां प्रविष्टिं (सञ्चिकां वा निर्देशिकां वा) प्रतिनिधियति ।

4.अपवादनियन्त्रणम् : १.

FileNotFoundException: अस्तित्वहीनां सञ्चिकां प्राप्तुं प्रयतमाने क्षिप्तम् ।

IOException: इनपुट्-आउटपुट्-सञ्चालनेषु सामान्य-अपवादानाम् नियन्त्रणार्थं प्रयुक्तम् ।

RarException: RAR संग्रहणसञ्चालनसम्बद्धानि विशिष्टानि अपवादाः सम्पादयति ।

5. आँकडा निवेशः निर्गमः च धाराः : १.

InputStream: दत्तांशपठनार्थं इनपुट् स्ट्रीम।

6. संग्रहणसञ्चालनम् : १.

सूची: सञ्चिकाशीर्षकसूचनाः संग्रहीतुं प्रयुक्ता सूची ।

7. तुलनात्मकः : १.सञ्चिकाशीर्षकसूचीं क्रमयितुं प्रयुक्तम् ।

8. तृतीयपक्षपुस्तकालये FileUtils वर्ग commons-io:(इदं जार-सङ्कुलं लेखस्य अन्ते अस्ति)

निर्देशिकाः विलोपयितुं निवेशप्रवाहानाम् सञ्चिकासु प्रतिलिपिं कर्तुं च उपयुज्यते ।

2. कोडप्रदर्शनम् (विघटितसंस्करणम्) .

Step 1: सञ्चिकाप्रकारं निर्धारयन्तु

  • यदि ".zip" सञ्चिका अस्ति तर्हि ZIP सञ्चिकां विसंपीडयितुं unzip() विधिं आह्वयन्तु यदि ".rar" सञ्चिका अस्ति तर्हि RAR सञ्चिकां विसंपीडयितुं unrar() विधिं आह्वयन्तु ।
  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. }

Step 2: unzip() मेथड् परिभाषयन्तु

  • इनपुट् सञ्चिकामार्गस्य आधारेण स्रोतसञ्चिकावस्तु निर्माति ।
  • विसंपीडितं मूलनिर्देशिकामार्गं निर्धारयित्वा तत्सम्बद्धं सञ्चिकावस्तु रचयन्तु ।
  • यदि मूलनिर्देशिका पूर्वमेव अस्ति तर्हि तत् विलोपयितुं प्रयतस्व (उपयोगं चFileUtilsUtility class अरिक्तनिर्देशिकाः विलोपयति) ततः मूलनिर्देशिकां पुनः निर्माति ।
  • ZIP प्रारूपं पठितुं निवेशधारा रचयन्तु ।
  • संग्रहे प्रत्येकं प्रविष्टिः (उपसञ्चिका वा उपनिर्देशिका वा) माध्यमेन पुनरावृत्तिः कुर्वन्तु ।
  • प्रत्येकं प्रविष्टेः कृते तत्सम्बद्धं सञ्चिकावस्तु रचयन्तु ।
  • प्रविष्टिः उपसञ्चिका अस्ति वा उपनिर्देशिका वा इति निर्धारयन्तु, क्रमशः सञ्चिकां वा निर्देशिकां वा रचयन्तु ।
  • उपसञ्चिकानां कृते एकं आउटपुट् स्ट्रीम रचयन्तु, इनपुट् स्ट्रीमतः दत्तांशं पठित्वा उपसञ्चिकायां लिखन्तु ।
  • सम्भाव्यं सञ्चिकां न लब्धां तथा च निवेशं निर्गमं च अपवादं च नियन्त्रयन्तु ।
  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. }

Step 3: unrar() मेथड् परिभाषयन्तु

  • इनपुट् RAR सञ्चिकामार्गस्य आधारेण मूलनिर्देशिकायाः ​​सञ्चिकावस्तु रचयन्तु ।
  • मूलनिर्देशिका अस्ति वा इति निर्धारयन्तु, यदि अस्ति तर्हि तत् विलोपयितुं प्रयतध्वम् (उपयोगःFileUtilsसम्भवं अपवादं सम्पादयन्तु) ततः मूलनिर्देशिकां रचयन्तु ।
  • RAR संपीडितसञ्चिकानां पठनार्थं सञ्चिकां रचयन्तुArchiveवस्तु।
  • संपीडितसञ्चिकायां सर्वाणि उपनिर्देशिकाः उपसञ्चिकाः च प्राप्नुवन्तुFileHeaderवस्तुं कृत्वा सूचीयां संगृहीतम्।
  • उपनिर्देशिकानां उपसञ्चिकानां च नाम्ना सूचीं क्रमयन्तु ।
  • सूचीस्थ प्रत्येकस्य द्रव्यस्य उपरि पुनरावृत्तिः कुर्वन्तुFileHeaderवस्तु।
  • तदनुसारम्FileHeaderObject तत्सम्बद्धं file object निर्माति ।
  • उपनिर्देशिका वा उपसञ्चिका वा इति निर्धारयन्तु, क्रमशः निर्देशिकां वा सञ्चिकां वा रचयन्तु ।
  • उपसञ्चिकानां कृते, निवेशप्रवाहं प्राप्य उपयोगं कुर्वन्तुFileUtilsनिवेशधाराम् उपसञ्चिकायां प्रतिलिपिं करोति ।
  • सम्भाव्य RAR-सम्बद्धान् अपवादं तथा निवेश-निर्गम-अपवादं सम्पादयन्तु ।
  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. कोडप्रदर्शनम् (समग्रं संस्करणम्) .

  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. उपयोगपरिदृश्यानि

उपरिष्टात् सामान्यसंपीडनस्वरूपद्वये (ZIP तथा RAR) सञ्चिकानां कृते विसंपीडनकार्यं प्रदाति । निवेशसञ्चिकायाः ​​प्रारूपस्य न्यायं कृत्वा (सञ्चिकाविस्तारस्य अनुसारं), तत्सम्बद्धं विसंपीडनविधिं (unzipवाunrar), संपीडितसञ्चिकायाः ​​सामग्रीं निर्दिष्टनिर्देशिकायां सम्यक् विसंपीडयितुं शक्नोति ।

एतत् विशेषता अनेकेषु परिदृश्येषु अतीव उपयोगी भवति, यथा-

  1. दत्तांशसंसाधनं विश्लेषणं च : यदा दत्तांशः संपीडितरूपेण प्राप्यते तदा संसाधनविश्लेषणार्थं मूलदत्तांशं प्राप्तुं तस्य विसंपीडनस्य आवश्यकता भवति
  2. सञ्चिकास्थापनं भण्डारणं च : सञ्चिकास्थापनस्य अथवा भण्डारणस्य समये संपीडनं स्थानं रक्षितुं स्थानान्तरणदक्षतां च सुधारयितुं शक्नोति, ततः गन्तव्यस्थानं प्राप्तस्य मूलसञ्चिकासंरचनायाः पुनर्स्थापनार्थं विसंपीडनं कर्तुं शक्नोति
  3. सॉफ्टवेयर विकासः : विकासप्रक्रियायाः कालखण्डे विभिन्नस्रोताभ्यां संपीडितसञ्चिकासंसाधनानाम् संसाधनं एकीकरणं च आवश्यकं भवितुम् अर्हति ।

समग्रतया, एषः कोडः ZIP तथा RAR संपीडितसञ्चिकानां विसंपीडनकार्यक्रमं नियन्त्रयितुं लचीलाः पुनः उपयोगयोग्यः च मार्गं प्रदाति, यत् विभिन्नेषु अनुप्रयोगेषु संपीडितसञ्चिकानां संसाधनस्य आवश्यकतां पूरयति