1

jarファイルを操作するJavaライブラリを推奨できる人はいますか? 私はjava.util.jarで利用可能な機能をかなり簡潔に見つけています (または、見るべきサンプルコードがいくつかないかもしれません)。次のようなことに興味があります。

  1. jarにファイルを追加する
  2. jarからファイルを削除する
  3. フォルダからjarファイルを作成する
  4. jarファイルをフォルダーに圧縮する
  5. jar エントリの内容の読み取り(おそらくメモリ内で、ディスク上のjarを圧縮する必要はありません)
  6. ディスク上のファイルから読み取ることなく、メモリ内にjar エントリを作成します。
  7. jarファイルのエントリがマニフェストファイルまたはその他の特別なファイルであるかどうかを尋ねます。

誰かがjava.util.jarまたは役立つ他のライブラリを使用してコード例を指摘できる場合。特にjava.util.jarのクラスとメソッドを見ると、特定の Jar エントリの内容を読み取る方法や、 (外部プロセスを生成せずに) jarを収縮する方法さえも明確ではありません。

4

4 に答える 4

2

jar は、異なる拡張子 (およびマニフェスト) を持つ単なるzip ファイルであるため、 zip4jjava.util.zipなどの zip ライブラリに興味があるかもしれません。

于 2012-08-28T18:09:04.663 に答える
2

1 と 2 は、エントリを Jar から別のエントリにコピーし、必要なエントリを追加または残して、元のファイルを削除し、新しいファイルの名前を変更して置き換える単純な手動操作です。

jtahlbom が指摘したように、Java Jar API はそのまま残りを処理します。

例による更新

これらは本当に基本的な例です。Jar の読み書きの方法を示します。基本的に、そこから、必要な他のすべてのことを導き出すことができます。

個人用ライブラリ (含まれていません) をセットアップしましInputStreamOutputStream。これは、どこからでも読み書きできることを意味し、ほとんどの要件をカバーできます。

public void unjar(File jar, File outputPath) throws IOException {
    JarFile jarFile = null;
    try {
        if (outputPath.exits() || outputPathFile.mkdirs()) {
            jarFile = new JarFile(jar);
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                File path = new File(outputPath + File.separator + entry.getName());
                if (entry.isDirectory()) {
                    if (!path.exists() && !path.mkdirs()) {
                        throw new IOException("Failed to create output path " + path);
                    }
                } else {
                    System.out.println("Extracting " + path);

                    InputStream is = null;
                    OutputStream os = null;
                    try {
                        is = jarFile.getInputStream(entry);
                        os = new FileOutputStream(path);

                        byte[] byteBuffer = new byte[1024];
                        int bytesRead = -1;
                        while ((bytesRead = is.read(byteBuffer)) != -1) {
                            os.write(byteBuffer, 0, bytesRead);
                        }
                        os.flush();
                    } finally {
                        try {
                            os.close();
                        } catch (Exception e) {
                        }
                        try {
                            is.close();
                        } catch (Exception e) {
                        }
                    }
                }
            }
        } else {
            throw IOException("Output path does not exist/could not be created");
        }
    } finally {
        try {
            jarFile.close();
        } catch (Exception e) {
        }
    }
}

public void jar(File jar, File sourcePath) throws IOException {
    JarOutputStream jos = null;
    try {
        jos = new JarOutputStream(new FileOutputStream(jar));

        List<File> fileList = getFiles(sourcePath);
        System.out.println("Jaring " + fileList.size() + " files");

        List<String> lstPaths = new ArrayList<String>(25);
        for (File file : fileList) {
            String path = file.getParent().replace("\\", "/");
            String name = file.getName();

            path = path.substring(sourcePath.getPath().length());
            if (path.startsWith("/")) {
                path = path.substring(1);
            }

            if (path.length() > 0) {
                path += "/";
                if (!lstPaths.contains(path)) {
                    JarEntry entry = new JarEntry(path);
                    jos.putNextEntry(entry);
                    jos.closeEntry();
                    lstPaths.add(path);
                }
            }

            System.out.println("Adding " + path + name);

            JarEntry entry = new JarEntry(path + name);
            jos.putNextEntry(entry);

            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                byte[] byteBuffer = new byte[1024];
                int bytesRead = -1;
                while ((bytesRead = fis.read(byteBuffer)) != -1) {
                    jos.write(byteBuffer, 0, bytesRead);
                }
                jos.flush();
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            jos.closeEntry();
        }
        jos.flush();
    } finally {
        try {
            jos.close();
        } catch (Exception e) {
        }
    }
}

時間を見てみると、SOのzip / jarファイルからエントリを追加/削除する方法の例がいくつかあります

于 2012-08-28T20:41:25.937 に答える
1

TrueZipはかなり包括的な zip ライブラリのようです。

ところで、jdk jar API は 3 ~ 7 をかなり簡単に処理できると確信しています。

于 2012-08-28T18:27:34.047 に答える
0

Apache Commons Compressがここで役立つかもしれません。

于 2012-08-28T18:08:44.493 に答える