minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Índice
1. Pontos de conhecimento usados
2. Exibição de código (versão decomposta)
3. Exibição de código (versão geral)
Fluxo 1.IO:
Entrada: entrada, leitura de arquivos por meio do "fluxo de entrada"
Saída: saída, gravação de arquivos por meio do "fluxo de saída"
2. Operação de arquivo relacionada:
Classe de arquivo: usada para representar caminhos para arquivos e diretórios.
FileInputStream e FileOutputStream: usados para ler e gravar arquivos.
3. Processamento de arquivo compactado:
ZipInputStream: Fluxo de entrada para leitura de arquivos compactados ZIP.
ZipEntry: Representa uma entrada (arquivo ou diretório) em um arquivo compactado ZIP.
4. Tratamento de exceções:
FileNotFoundException: lançada ao tentar acessar um arquivo que não existe.
IOException: usado para tratar exceções gerais em operações de entrada e saída.
RarException: Lida com exceções específicas relacionadas a operações de arquivo RAR.
5. Fluxos de entrada e saída de dados:
InputStream: Fluxo de entrada para leitura de dados.
6. Operações de cobrança:
Lista: Uma lista usada para armazenar informações de cabeçalho de arquivo.
7. Comparador:Usado para classificar a lista de cabeçalhos de arquivos.
8. Classe FileUtils na biblioteca de terceiros commons-io:(Este pacote jar está no final do artigo)
Usado para excluir diretórios e copiar fluxos de entrada para arquivos.
Etapa 1: determine o tipo de arquivo
- Se for um arquivo “.zip”, chame o método unzip() para descompactar o arquivo ZIP. Se for um arquivo “.rar”, chame o método unrar() para descompactar o arquivo 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);
- }
- }
Etapa 2: definir o método unzip()
- Cria um objeto de arquivo de origem com base no caminho do arquivo de entrada.
- Determine o caminho do diretório raiz descompactado e crie o objeto de arquivo correspondente.
- Se o diretório raiz já existir, tente excluí-lo (inclusive usando
FileUtils
A classe utilitária exclui diretórios não vazios) e, em seguida, recria o diretório raiz.- Crie um fluxo de entrada para leitura do formato ZIP.
- Itere através de cada entrada (subarquivo ou subdiretório) no arquivo.
- Crie um objeto de arquivo correspondente para cada entrada.
- Determine se a entrada é um subarquivo ou um subdiretório e crie o arquivo ou diretório respectivamente.
- Para subarquivos, crie um fluxo de saída, leia os dados do fluxo de entrada e grave no subarquivo.
- Lidar com possíveis arquivos não encontrados e exceções de entrada e saída.
- //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();
- }
- }
Etapa 3: Defina o método unrar()
- Crie um objeto de arquivo do diretório raiz com base no caminho do arquivo RAR de entrada.
- Determine se o diretório raiz existe e, se existir, tente excluí-lo (use
FileUtils
lidar com possíveis exceções) e, em seguida, crie o diretório raiz.- Crie um arquivo para ler arquivos compactados RAR
Archive
objeto.- Obtenha todos os subdiretórios e subarquivos em um arquivo compactado
FileHeader
objeto e armazenado na lista.- Classifique a lista pelos nomes dos subdiretórios e subarquivos.
- Iterar sobre cada item da lista
FileHeader
objeto.- de acordo com
FileHeader
Object cria o objeto de arquivo correspondente.- Determine se é um subdiretório ou um subarquivo e crie o diretório ou arquivo respectivamente.
- Para subarquivos, obtenha o fluxo de entrada e use
FileUtils
Copia o fluxo de entrada em um subarquivo.- Lidar com possíveis exceções relacionadas ao RAR e exceções de entrada e saída.
- //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();
- }
- }
- }
-
O texto acima fornece funções de descompactação para arquivos em dois formatos de compactação comuns (ZIP e RAR). Ao julgar o formato do arquivo de entrada (de acordo com a extensão do arquivo), chame o método de descompactação correspondente (unzip
ouunrar
), pode descompactar corretamente o conteúdo do arquivo compactado no diretório especificado.
Esse recurso é muito útil em muitos cenários, como:
No geral, esse código fornece uma maneira flexível e reutilizável de lidar com as operações de descompactação de arquivos compactados ZIP e RAR, atendendo às necessidades de processamento de arquivos compactados em diversos aplicativos.