私の連絡先情報
郵便メール:
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
オブジェクトは、対応するファイル オブジェクトを作成します。- サブディレクトリかサブファイルかを判断し、それぞれディレクトリまたはファイルを作成します。
- サブファイルの場合は、入力ストリームを取得して使用します。
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();
- }
- }
- }
-
上記は、2 つの一般的な圧縮形式 (ZIP および RAR) のファイルの解凍機能を提供します。入力ファイルの形式(ファイル拡張子に応じて)を判断し、対応する解凍メソッドを呼び出します(unzip
またはunrar
)、圧縮ファイルの内容を指定したディレクトリに正しく解凍できます。
この機能は、次のような多くのシナリオで非常に役立ちます。
全体として、このコードは、ZIP および RAR 圧縮ファイルの解凍操作を処理する柔軟で再利用可能な方法を提供し、さまざまなアプリケーションで圧縮ファイルを処理するニーズを満たします。