それが主な問題です.zipファイル内のファイルをファイルの配列として取得する方法
5 に答える
zip からファイルを抽出する以外に、zip ファイル内のファイルを直接参照する URI スキームを知りません。そのため、インスタンスでString
はなくファイル名のリストで終了します。File
したがってZipFile
、 、ZipEntry
、入力ストリームなどのクラスを使用して Zip からファイルを抽出すると、配列内でそれを参照する File インスタンスを作成できます。
簡単な答えは、できないということです。AFile
は基本的に、ホスト オペレーティング システムのファイル システム内のオブジェクトの抽象化されたファイル システム パスです。ただし、ZIP ファイル内のファイルはファイル システム内のオブジェクトではないため、ファイル システム パスはありません。
考えてみてください。Linux で<pathname>
(たとえば) 実行できるような ZIP ファイル エントリを作成できますか? cat <pathname>
またはWindowsで似たようなものはありますか?
それで、あなたは何ができますか?
ZIP ファイルをファイル システムに抽出し (外部コマンドを使用するのが最も簡単です)、抽出したエントリを含むファイルを参照できます。ZIP のディレクトリ構造を対応するパス名に変換するには、少し手を加える必要があります。
File オブジェクトの代わりにオブジェクトを使用できます
ZipEntry
が、Zip ファイルが開いている間のみ有効/使用可能になると思います。FileSystem
ZIP ファイルをファイル システムとして扱うことができるJava 7 スタイルの実装を見つけたり、作成したりできます。File
しかし、それらの API はオブジェクトなどを使用しません。お使いのオペレーティング システムがサポートしている場合は、ZIP ファイルをファイル システムとして「マウント」してから動作させることができます
File
。例: http://en.wikipedia.org/wiki/Filesystem_in_Userspaceプラスhttp://code.google.com/p/fuse-zip/
また、Apache Commons Compress api を確認してください。開始方法の例がいくつかあります http://commons.apache.org/compress/examples.html
アップデート
zip 内のファイルの配列を取得するには、最初にそれらを一時的な場所に抽出する必要があります。
import java.util.zip.*;
import java.io.File;
import java.util.ArrayList;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.io.IOException;
public class ZipFileExtractor {
public static void main(String[] args) {
File[] zipFiles = ZipFileExtractor.getFileArray("archive.zip");
System.out.println(zipFiles.length);
}
public static File[] getFileArray(String archiveFileName) {
ArrayList<File> zipArrayList = new ArrayList<File>();
try {
ZipFile zFile = new ZipFile(archiveFileName);
for (Enumeration<? extends ZipEntry> e = zFile.entries(); e.hasMoreElements(); ) {
ZipEntry zEntry = e.nextElement();
InputStream in = zFile.getInputStream(zEntry);
File temp = File.createTempFile(zFile.getName(), null);
temp.deleteOnExit();
FileOutputStream out = new FileOutputStream(temp);
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
out.write(buffer);
}
zipArrayList.add(temp);
}
} catch (IOException e) {
}
return zipArrayList.toArray(new File[zipArrayList.size()]);
}
}
パッケージにはZipInputStreamという API クラスがあります。java.util.zip
それにはたくさんのメソッドがあり、その中にgetNextEntry()
はほとんどそれを行うものがあります:
ArrayList<ZipEntry> zipArrayList = new ArrayList<ZipEntry>();
ZipInputStream zis = ZipInputStream(new FileInputStream("archive.zip"));
while ((ZipEntry ze = zis.getNextEntry()) != null) {
zipArrayList.add(ze.getName());
}
上記のコードをコンパイルしようとはしていないので、いくつか問題があるかもしれませんが、アイデアが明確であることを願っています.
java.util.zip
ファイルを解凍するためのユーティリティを含むパッケージをチェックアウトすることをお勧めします。