informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Daftar isi
1. Poin pengetahuan yang digunakan
2. Tampilan kode (versi terurai)
3. Tampilan kode (versi keseluruhan)
1. Aliran IO:
Input: input, baca file melalui "aliran input"
Keluaran: Keluaran, tulis file melalui "aliran keluaran"
2. Operasi file terkait:
Kelas file: digunakan untuk mewakili jalur ke file dan direktori.
FileInputStream dan FileOutputStream: digunakan untuk membaca dan menulis file.
3. Pemrosesan file terkompresi:
ZipInputStream: Aliran input untuk membaca file terkompresi ZIP.
ZipEntry: Mewakili entri (file atau direktori) dalam file terkompresi ZIP.
4. Penanganan pengecualian:
FileNotFoundException: Dilempar saat mencoba mengakses file yang tidak ada.
IOException: digunakan untuk menangani pengecualian umum dalam operasi input dan output.
RarException: Menangani pengecualian spesifik yang terkait dengan operasi arsip RAR.
5. Aliran masukan dan keluaran data:
InputStream: Aliran input untuk membaca data.
6. Operasi pengumpulan:
Daftar: Daftar yang digunakan untuk menyimpan informasi header file.
7. Pembanding:Digunakan untuk mengurutkan daftar file header.
8. Kelas FileUtils di perpustakaan pihak ketiga commons-io:(Paket toples ini ada di akhir artikel)
Digunakan untuk menghapus direktori dan menyalin aliran input ke file.
Langkah 1: Tentukan jenis file
- Jika itu adalah file ".zip", panggil metode unzip() untuk mendekompresi file ZIP. Jika itu adalah file ".rar", panggil metode unrar() untuk mendekompresi file 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);
- }
- }
Langkah 2: Tentukan metode unzip()
- Membuat objek file sumber berdasarkan jalur file input.
- Tentukan jalur direktori root yang didekompresi dan buat objek file yang sesuai.
- Jika direktori root sudah ada, coba hapus (termasuk menggunakan
FileUtils
Kelas utilitas menghapus direktori yang tidak kosong) dan kemudian membuat ulang direktori root.- Buat aliran input untuk membaca format ZIP.
- Ulangi setiap entri (subfile atau subdirektori) dalam arsip.
- Buat objek file yang sesuai untuk setiap entri.
- Tentukan apakah entri tersebut merupakan subfile atau subdirektori, dan buat file atau direktori masing-masing.
- Untuk subfile, buat aliran keluaran, baca data dari aliran masukan dan tulis ke subfile.
- Tangani kemungkinan file tidak ditemukan serta pengecualian input dan output.
- //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();
- }
- }
Langkah 3: Tentukan metode unrar()
- Buat objek file dari direktori root berdasarkan jalur file input RAR.
- Tentukan apakah direktori root ada, dan jika ada, coba hapus (gunakan
FileUtils
menangani kemungkinan pengecualian) dan kemudian membuat direktori root.- Buat file untuk membaca file terkompresi RAR
Archive
obyek.- Dapatkan semua subdirektori dan subfile dalam file terkompresi
FileHeader
objek dan disimpan dalam daftar.- Urutkan daftar berdasarkan nama subdirektori dan subfile.
- Ulangi setiap item dalam daftar
FileHeader
obyek.- berdasarkan
FileHeader
Objek membuat objek file yang sesuai.- Tentukan apakah itu subdirektori atau subfile, dan buat direktori atau file masing-masing.
- Untuk subfile, dapatkan aliran input dan gunakan
FileUtils
Menyalin aliran input ke dalam subfile.- Tangani kemungkinan pengecualian terkait RAR serta pengecualian input dan output.
- //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();
- }
- }
- }
-
Di atas menyediakan fungsi dekompresi untuk file dalam dua format kompresi umum (ZIP dan RAR). Dengan menilai format file input (menurut ekstensi file), panggil metode dekompresi yang sesuai (unzip
atauunrar
), dapat mendekompresi konten file terkompresi dengan benar ke dalam direktori yang ditentukan.
Fitur ini sangat berguna dalam banyak skenario, seperti:
Secara keseluruhan, kode ini menyediakan cara yang fleksibel dan dapat digunakan kembali untuk menangani operasi dekompresi file terkompresi ZIP dan RAR, memenuhi kebutuhan pemrosesan file terkompresi dalam berbagai aplikasi.