2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Table des matières
1. Points de connaissances utilisés
2. Affichage du code (version décomposée)
3. Affichage du code (version globale)
Flux 1.IO :
Entrée : entrée, lecture des fichiers via le "flux d'entrée"
Sortie : Sortie, écriture de fichiers via le "flux de sortie"
2. Opération de fichier liée :
Classe de fichiers : utilisée pour représenter les chemins d’accès aux fichiers et répertoires.
FileInputStream et FileOutputStream : utilisés pour lire et écrire des fichiers.
3. Traitement des fichiers compressés :
ZipInputStream : flux d'entrée pour lire les fichiers compressés ZIP.
ZipEntry : représente une entrée (fichier ou répertoire) dans un fichier compressé ZIP.
4.Gestion des exceptions :
FileNotFoundException : levée lors de la tentative d'accès à un fichier qui n'existe pas.
IOException : utilisé pour gérer les exceptions générales dans les opérations d'entrée et de sortie.
RarException : gère les exceptions spécifiques liées aux opérations d'archive RAR.
5. Flux d’entrée et de sortie de données :
InputStream : flux d’entrée pour la lecture des données.
6. Opérations de collecte :
Liste : une liste utilisée pour stocker les informations d'en-tête de fichier.
7. Comparateur :Utilisé pour trier la liste des en-têtes de fichiers.
8. Classe FileUtils dans la bibliothèque tierce commons-io :(Ce paquet de pots se trouve à la fin de l'article)
Utilisé pour supprimer des répertoires et copier les flux d'entrée dans des fichiers.
Étape 1 : Déterminez le type de fichier
- S'il s'agit d'un fichier ".zip", appelez la méthode unzip() pour décompresser le fichier ZIP. S'il s'agit d'un fichier ".rar", appelez la méthode unrar() pour décompresser le fichier RAR.
- //指定文件夹
- String Path = “D:\...\xxxx.zip”
- String Path = “D:\...\xxxx.rar”
- }
- //1.判断文件类型
- if(path.endsWith(".zip")) {
- unzip(path);
- }else if(path.endsWith(".rar")) {
- unrar(path);
- }
- }
Étape 2 : Définir la méthode unzip()
- Crée un objet fichier source basé sur le chemin du fichier d'entrée.
- Déterminez le chemin du répertoire racine décompressé et créez l’objet fichier correspondant.
- Si le répertoire racine existe déjà, essayez de le supprimer (y compris en utilisant
FileUtils
La classe utilitaire supprime les répertoires non vides), puis recrée le répertoire racine.- Créez un flux d'entrée pour lire le format ZIP.
- Parcourez chaque entrée (sous-fichier ou sous-répertoire) de l'archive.
- Créez un objet fichier correspondant pour chaque entrée.
- Déterminez si l'entrée est un sous-fichier ou un sous-répertoire et créez respectivement le fichier ou le répertoire.
- Pour les sous-fichiers, créez un flux de sortie, lisez les données du flux d'entrée et écrivez dans le sous-fichier.
- Gérez les éventuels fichiers introuvables et les exceptions d’entrée et de sortie.
- //2.解压缩zip格式
- public static void unzip(String path) {
- //(1)根据原始路径(字符串),创建源文件(File对象)
- File sourceFile = new File(path);
-
- //(2)根目录
- String sourceName = sourceFile.getName();
- File rootDir = new File(sourceFile.getParent()+"\"+sourceName.substring(0,sourceName.lastIndexOf(".")));
-
- //(3)判断根目录是否已经存在
- if(rootDir.exists()) {
- //若存在,则删除
- rootDir.delete();//只能删除空目录
- //使用commons-io包提供的FileUtils工具类进行删除
- try {
- FileUtils.deleteDirectory(rootDir);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //(4)创建根目录
- rootDir.mkdir();
-
- //(5)ZipInputStream:用于进行zip格式的压缩输入流
- try {
- ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));
-
- //(6)遍历压缩包中每个子文件子目录(zipEntry类型的对象)
- ZipEntry zipEntry = null;
- while((zipEntry = in.getNextEntry())!=null) {
- //(7)创建子文件子目录(File对象)
- File file = new File(rootDir.getPath()+"\"+zipEntry.getName());
-
- //(8)判断是子文件还是子目录(不是子目录就是子文件)
- if(zipEntry.isDirectory()) {
- //物理磁盘创建子目录
- file.mkdir();
- }else {
- //物理磁盘创建子文件
- file.createNewFile();
- //(9)子文件的写入
- //读取当前压缩包的子文件,并通过输出流out写入新子文件中
- try (FileOutputStream out = new FileOutputStream(file)) {
-
- byte[] buff = new byte[1024];
- int len = -1;
- while((len = in.read(buff))!=-1) {
- out.write(buff,0,len);
- }
- }
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
Étape 3 : Définir la méthode unrar()
- Créez un objet fichier du répertoire racine en fonction du chemin du fichier RAR d'entrée.
- Déterminez si le répertoire racine existe, et s'il existe, essayez de le supprimer (utilisez
FileUtils
gérer les exceptions possibles), puis créez le répertoire racine.- Créer un fichier pour lire les fichiers compressés RAR
Archive
objet.- Obtenez tous les sous-répertoires et sous-fichiers dans un fichier compressé
FileHeader
objet et stocké dans la liste.- Triez la liste par noms de sous-répertoires et de sous-fichiers.
- Parcourez chaque élément de la liste
FileHeader
objet.- selon
FileHeader
Object crée l'objet fichier correspondant.- Déterminez s'il s'agit d'un sous-répertoire ou d'un sous-fichier et créez respectivement le répertoire ou le fichier.
- Pour les sous-fichiers, récupérez le flux d'entrée et utilisez
FileUtils
Copie le flux d'entrée dans un sous-fichier.- Gérez les éventuelles exceptions liées à RAR et les exceptions d’entrée et de sortie.
- //3.解压缩rar格式
- public static void unrar(String path) {
- //(1)创建解压缩的根目录
- File rarFile = new File(path);
- File rootDir = new File(rarFile.getParent()+"\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
- //(2)判断是否存在
- if(rootDir.exists()) {
- try {
- FileUtils.deleteDirectory(rootDir);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- rootDir.mkdir();
-
- //(3)创建Archive对象,用于读取rar压缩文件格式
- try (Archive archive = new Archive(new FileInputStream(path))){
-
- //(4)获取压缩文件所有子目录子文件(FileHeader对象)
- List<FileHeader> fileheaderList = archive.getFileHeaders();
-
- //(5)按照子目录(子文件)名称排序
- fileheaderList.sort(new Comparator<FileHeader>() {
- @Override
- public int compare(FileHeader o1, FileHeader o2) {
- return o1.getFileName().compareTo(o2.getFileName());
- }
- });
- //(6)遍历子目录子文件
- for(FileHeader fd : fileheaderList) {
- File f = new File(rootDir.getPath()+"\"+fd.getFileName());
-
- if(fd.isDirectory()) {
- //物理磁盘创建子目录
- f.mkdir();
- }else {
- //物理磁盘创建子文件
- f.createNewFile();
-
- //获取压缩包中子文件输入流
- InputStream in = archive.getInputStream(fd);
-
- //复制文件输入流至子文件
- FileUtils.copyInputStreamToFile(in, f);
- }
- }
-
- } catch (RarException | IOException e) {
- e.printStackTrace();
- }
- }
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Comparator;
- import java.util.List;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipInputStream;
-
- import org.apache.commons.io.FileUtils;
-
- import com.github.junrar.Archive;
- import com.github.junrar.exception.RarException;
- import com.github.junrar.rarfile.FileHeader;
-
- public class Test {
- //指定文件夹
- String Path = “D:\...\xxxx.zip”
- String Path = “D:\...\xxxx.rar”
- }
- //1.判断文件类型
- if(path.endsWith(".zip")) {
- unzip(path);
- }else if(path.endsWith(".rar")) {
- unrar(path);
- }
- }
- //2.解压缩zip格式
- public static void unzip(String path) {
- //(1)根据原始路径(字符串),创建源文件(File对象)
- File sourceFile = new File(path);
-
- //(2)根目录
- String sourceName = sourceFile.getName();
- File rootDir = new File(sourceFile.getParent()+"\"+sourceName.substring(0,sourceName.lastIndexOf(".")));
-
- //(3)判断根目录是否已经存在
- if(rootDir.exists()) {
- //若存在,则删除
- rootDir.delete();//只能删除空目录
- //使用commons-io包提供的FileUtils工具类进行删除
- try {
- FileUtils.deleteDirectory(rootDir);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //(4)创建根目录
- rootDir.mkdir();
-
- //(5)ZipInputStream:用于进行zip格式的压缩输入流
- try {
- ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));
-
- //(6)遍历压缩包中每个子文件子目录(zipEntry类型的对象)
- ZipEntry zipEntry = null;
- while((zipEntry = in.getNextEntry())!=null) {
- //(7)创建子文件子目录(File对象)
- File file = new File(rootDir.getPath()+"\"+zipEntry.getName());
-
- //(8)判断是子文件还是子目录(不是子目录就是子文件)
- if(zipEntry.isDirectory()) {
- //物理磁盘创建子目录
- file.mkdir();
- }else {
- //物理磁盘创建子文件
- file.createNewFile();
- //(9)子文件的写入
- //读取当前压缩包的子文件,并通过输出流out写入新子文件中
- try (FileOutputStream out = new FileOutputStream(file)) {
-
- byte[] buff = new byte[1024];
- int len = -1;
- while((len = in.read(buff))!=-1) {
- out.write(buff,0,len);
- }
- }
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //3.解压缩rar格式
- public static void unrar(String path) {
- //(1)创建解压缩的根目录
- File rarFile = new File(path);
- File rootDir = new File(rarFile.getParent()+"\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
- //(2)判断是否存在
- if(rootDir.exists()) {
- try {
- FileUtils.deleteDirectory(rootDir);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- rootDir.mkdir();
-
- //(3)创建Archive对象,用于读取rar压缩文件格式
- try (Archive archive = new Archive(new FileInputStream(path))){
-
- //(4)获取压缩文件所有子目录子文件(FileHeader对象)
- List<FileHeader> fileheaderList = archive.getFileHeaders();
-
- //(5)按照子目录(子文件)名称排序
- fileheaderList.sort(new Comparator<FileHeader>() {
- @Override
- public int compare(FileHeader o1, FileHeader o2) {
- return o1.getFileName().compareTo(o2.getFileName());
- }
- });
- //(6)遍历子目录子文件
- for(FileHeader fd : fileheaderList) {
- File f = new File(rootDir.getPath()+"\"+fd.getFileName());
-
- if(fd.isDirectory()) {
- //物理磁盘创建子目录
- f.mkdir();
- }else {
- //物理磁盘创建子文件
- f.createNewFile();
-
- //获取压缩包中子文件输入流
- InputStream in = archive.getInputStream(fd);
-
- //复制文件输入流至子文件
- FileUtils.copyInputStreamToFile(in, f);
- }
- }
-
- } catch (RarException | IOException e) {
- e.printStackTrace();
- }
- }
- }
-
Ce qui précède fournit des fonctions de décompression pour les fichiers dans deux formats de compression courants (ZIP et RAR). En jugeant le format du fichier d'entrée (selon l'extension du fichier), appelez la méthode de décompression correspondante (unzip
ouunrar
), peut décompresser correctement le contenu du fichier compressé dans le répertoire spécifié.
Cette fonctionnalité est très utile dans de nombreux scénarios, tels que :
Dans l'ensemble, ce code fournit un moyen flexible et réutilisable de gérer les opérations de décompression des fichiers compressés ZIP et RAR, répondant ainsi aux besoins de traitement des fichiers compressés dans diverses applications.