내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
목차
1.IO 스트림:
입력: 입력, "입력 스트림"을 통해 파일 읽기
출력: 출력, "출력 스트림"을 통해 파일 쓰기
2. 파일 작업 관련:
파일 클래스: 파일 및 디렉터리의 경로를 나타내는 데 사용됩니다.
FileInputStream 및 FileOutputStream: 파일을 읽고 쓰는 데 사용됩니다.
3. 압축 파일 처리:
ZipInputStream: ZIP 압축 파일을 읽기 위한 입력 스트림입니다.
ZipEntry: ZIP 압축 파일의 항목(파일 또는 디렉터리)을 나타냅니다.
4.예외 처리:
FileNotFoundException: 존재하지 않는 파일에 액세스하려고 할 때 발생합니다.
IOException: 입력 및 출력 작업의 일반적인 예외를 처리하는 데 사용됩니다.
RarException: RAR 아카이브 작업과 관련된 특정 예외를 처리합니다.
5. 데이터 입력 및 출력 스트림:
InputStream: 데이터를 읽기 위한 입력 스트림입니다.
6. 수집 작업:
목록: 파일 헤더 정보를 저장하는 데 사용되는 목록입니다.
7. 비교기:파일 헤더 목록을 정렬하는 데 사용됩니다.
8. 타사 라이브러리 commons-io의 FileUtils 클래스:(이 jar 패키지는 기사 마지막 부분에 있습니다.)
디렉터리를 삭제하고 입력 스트림을 파일에 복사하는 데 사용됩니다.
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 압축 파일의 압축 해제 작업을 처리하는 유연하고 재사용 가능한 방법을 제공하여 다양한 응용 프로그램에서 압축 파일을 처리하는 요구 사항을 충족합니다.