моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Оглавление
2. Отображение кода (разложенная версия)
3. Отображение кода (общая версия)
1. поток ввода-вывода:
Ввод: ввод, чтение файлов через «входной поток»
Вывод: Вывод, запись файлов через «выходной поток».
2. Операции с файлами, связанные с:
Класс файла: используется для представления путей к файлам и каталогам.
FileInputStream и FileOutputStream: используются для чтения и записи файлов.
3. Обработка сжатых файлов:
ZipInputStream: входной поток для чтения файлов, сжатых ZIP.
ZipEntry: представляет запись (файл или каталог) в сжатом ZIP-файле.
4. Обработка исключений:
FileNotFoundException: выдается при попытке доступа к несуществующему файлу.
IOException: используется для обработки общих исключений в операциях ввода и вывода.
RarException: обрабатывает определенные исключения, связанные с операциями с архивами RAR.
5. Потоки ввода и вывода данных:
InputStream: входной поток для чтения данных.
6. Инкассационные операции:
Список: список, используемый для хранения информации заголовка файла.
7. Компаратор:Используется для сортировки списка заголовков файлов.
8. Класс FileUtils в сторонней библиотеке commons-io:(Этот баночный пакет находится в конце статьи.)
Используется для удаления каталогов и копирования входных потоков в файлы.
Шаг 1. Определите тип файла
- Если это файл «.zip», вызовите метод unzip(), чтобы распаковать ZIP-файл. Если это файл «.rar», вызовите метод unrar(), чтобы распаковать файл 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);
- }
- }
Шаг 2. Определите метод unzip().
- Создает объект исходного файла на основе пути к входному файлу.
- Определите путь к распакованному корневому каталогу и создайте соответствующий файловый объект.
- Если корневой каталог уже существует, попробуйте удалить его (в том числе с помощью
FileUtils
Класс утилиты удаляет непустые каталоги), а затем воссоздает корневой каталог.- Создайте входной поток для чтения формата ZIP.
- Перебрать каждую запись (подфайл или подкаталог) в архиве.
- Создайте соответствующий файловый объект для каждой записи.
- Определите, является ли запись подфайлом или подкаталогом, и создайте файл или каталог соответственно.
- Для подфайлов создайте выходной поток, прочитайте данные из входного потока и запишите в подфайл.
- Обработка возможных файлов, которые не найдены, а также исключений ввода и вывода.
- //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. Определите метод unrar().
- Создайте файловый объект корневого каталога на основе входного пути к файлу RAR.
- Определите, существует ли корневой каталог, и если он существует, попробуйте удалить его (используйте
FileUtils
обрабатывать возможные исключения), а затем создать корневой каталог.- Создайте файл для чтения сжатых файлов RAR.
Archive
объект.- Получить все подкаталоги и подфайлы в сжатом файле.
FileHeader
объект и сохраняется в списке.- Отсортируйте список по именам подкаталогов и подфайлов.
- Перебирать каждый элемент в списке
FileHeader
объект.- в соответствии с
FileHeader
Object создает соответствующий файловый объект.- Определите, является ли это подкаталогом или подфайлом, и создайте каталог или файл соответственно.
- Для подфайлов получите входной поток и используйте
FileUtils
Копирует входной поток в подфайл.- Обработка возможных исключений, связанных с RAR, а также исключений ввода и вывода.
- //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();
- }
- }
- }
-
Вышеуказанное предоставляет функции распаковки файлов в двух распространенных форматах сжатия (ZIP и RAR). Оценив формат входного файла (по расширению файла), вызовите соответствующий метод распаковки (unzip
илиunrar
), может правильно распаковать содержимое сжатого файла в указанный каталог.
Эта функция очень полезна во многих сценариях, таких как:
В целом, этот код обеспечивает гибкий и многоразовый способ выполнения операций распаковки сжатых файлов ZIP и RAR, удовлетворяя потребности обработки сжатых файлов в различных приложениях.