2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sisällysluettelo
2. Koodinäyttö (hajotettu versio)
3. Koodinäyttö (kokonaisversio)
1.IO-stream:
Syöttö: syöttö, lue tiedostot "syöttövirran" kautta
Tulostus: Tulosta, kirjoita tiedostoja "lähtövirran" kautta
2. Tiedostotoimintoihin liittyvä:
Tiedostoluokka: käytetään edustamaan tiedostojen ja hakemistojen polkuja.
FileInputStream ja FileOutputStream: käytetään tiedostojen lukemiseen ja kirjoittamiseen.
3. Pakatun tiedoston käsittely:
ZipInputStream: Syöttövirta ZIP-pakkattujen tiedostojen lukemiseen.
ZipEntry: Edustaa merkintää (tiedostoa tai hakemistoa) ZIP-pakkatussa tiedostossa.
4. Poikkeuskäsittely:
FileNotFoundException: Heitetään, kun yritetään käyttää tiedostoa, jota ei ole olemassa.
IOException: käytetään käsittelemään yleisiä poikkeuksia syöttö- ja lähtöoperaatioissa.
RarException: Käsittelee erityisiä RAR-arkistointitoimintoihin liittyviä poikkeuksia.
5. Tietojen syöttö- ja lähtövirrat:
InputStream: Syöttövirta tietojen lukemiseen.
6. Keräystoiminnot:
Lista: Luettelo, jota käytetään tiedoston otsikkotietojen tallentamiseen.
7. Vertailu:Käytetään tiedostojen otsikkoluettelon lajitteluun.
8. FileUtils-luokka kolmannen osapuolen kirjastossa commons-io:(Tämä purkkipaketti on artikkelin lopussa)
Käytetään hakemistojen poistamiseen ja syöttövirtojen kopioimiseen tiedostoihin.
Vaihe 1: Määritä tiedostotyyppi
- Jos se on ".zip"-tiedosto, pura ZIP-tiedosto kutsumalla unzip()-menetelmää.
- //指定文件夹
- String Path = “D:\...\xxxx.zip”
- String Path = “D:\...\xxxx.rar”
- }
- //1.判断文件类型
- if(path.endsWith(".zip")) {
- unzip(path);
- }else if(path.endsWith(".rar")) {
- unrar(path);
- }
- }
Vaihe 2: Määritä unzip()-menetelmä
- Luo lähdetiedostoobjektin syöttötiedoston polun perusteella.
- Määritä puretun juurihakemiston polku ja luo vastaava tiedostoobjekti.
- Jos juurihakemisto on jo olemassa, yritä poistaa se (mukaan lukien
FileUtils
Apuohjelmaluokka poistaa ei-tyhjät hakemistot) ja luo sitten juurihakemiston uudelleen.- Luo syöttövirta ZIP-muodossa lukemista varten.
- Iteroi jokaisen arkiston merkinnän (alitiedoston tai alihakemiston) läpi.
- Luo jokaiselle merkinnälle vastaava tiedostoobjekti.
- Määritä, onko merkintä alitiedosto vai alihakemisto, ja luo tiedosto tai hakemisto vastaavasti.
- Luo alitiedostoille lähtövirta, lue tiedot tulovirrasta ja kirjoita alitiedostoon.
- Käsittele mahdollista tiedostoa ei löydy sekä syöttö- ja tulostuspoikkeuksia.
- //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();
- }
- }
Vaihe 3: Määritä unrar()-metodi
- Luo juurihakemiston tiedostoobjekti syötetyn RAR-tiedostopolun perusteella.
- Selvitä, onko juurihakemisto olemassa, ja jos se on olemassa, yritä poistaa se (käytä
FileUtils
käsittele mahdollisia poikkeuksia) ja luo sitten juurihakemisto.- Luo tiedosto RAR-pakkattujen tiedostojen lukemista varten
Archive
esine.- Hanki kaikki alihakemistot ja alitiedostot pakatussa tiedostossa
FileHeader
objekti ja tallennetaan luetteloon.- Lajittele luettelo alihakemistojen ja alitiedostojen nimien mukaan.
- Toista luettelon jokainen kohta
FileHeader
esine.- mukaan
FileHeader
Objekti luo vastaavan tiedostoobjektin.- Määritä, onko se alihakemisto vai alitiedosto, ja luo vastaava hakemisto tai tiedosto.
- Alatiedostoille hanki syöttövirta ja käytä
FileUtils
Kopioi syöttövirran alitiedostoon.- Käsittele mahdollisia RAR:iin liittyviä poikkeuksia sekä tulo- ja lähtöpoikkeuksia.
- //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();
- }
- }
- }
-
Yllä oleva tarjoaa purkutoiminnot tiedostoille kahdessa yleisessä pakkausmuodossa (ZIP ja RAR). Arvioimalla syöttötiedoston muodon (tiedostotunnisteen mukaan) kutsu vastaava purkumenetelmä (unzip
taiunrar
), voi purkaa pakatun tiedoston sisällön oikein määritettyyn hakemistoon.
Tämä ominaisuus on erittäin hyödyllinen monissa tilanteissa, kuten:
Kaiken kaikkiaan tämä koodi tarjoaa joustavan ja uudelleen käytettävän tavan käsitellä ZIP- ja RAR-pakkattujen tiedostojen purkutoimintoja, mikä täyttää pakattujen tiedostojen käsittelytarpeet eri sovelluksissa.