tanakahdaのプログラマ手帳

プログラミングとかソフトウェア開発とかの備忘録

jarファイルの中身を別フォルダへ出力@Java

jarファイルの中身を取り出して別フォルダに出力できるかやってみたところ後述のソースコードでできた。 ChatGPT先生に教えてもらった。

下記のプロジェクトを実行可能なjarしたあとに、実行すると自分自身の中身をhogeフォルダへ出力したい。

できた。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;


public class Main {

    public static void main(String[] args) {
        new Main().execute();
    }

    public void execute() {
        // jarファイルのパスを取得する
        String jarPath = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        // 出力先フォルダのパスを指定する
        String outputFolder = "/Users/tanakahda/Desktop/hoge";
        // jarファイルを開く
        try (JarFile jarFile = new JarFile(jarPath)) {
            // jarファイルに含まれるエントリを列挙する
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                // エントリを取得する
                JarEntry entry = entries.nextElement();
                // エントリの名前を取得する
                String entryName = entry.getName();
                // 出力先ファイルのパスを生成する
                String outputPath = outputFolder + File.separator + entryName;
                // 出力先ファイルの親ディレクトリを作成する
                File parentDir = new File(outputPath).getParentFile();
                if (!parentDir.exists()) {
                    parentDir.mkdirs();
                }
                // エントリがディレクトリでない場合、ファイルとして出力する
                if (!entry.isDirectory()) {
                    // 入力ストリームを開く
                    try (InputStream is = jarFile.getInputStream(entry)) {
                        // 出力ストリームを開く
                        try (OutputStream os = new FileOutputStream(outputPath)) {
                            // バイト配列を用意する
                            byte[] buffer = new byte[1024];
                            int len;
                            // 入力ストリームから読み込み、出力ストリームに書き込む
                            while ((len = is.read(buffer)) > 0) {
                                os.write(buffer, 0, len);
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}