こんにちは、私は zip 形式にまったく慣れていません。Java の util 実装を使用してファイルを解凍しましたが、ファイルを開こうとするたびに ZipException がスローされます。ファイルが破損しているかどうかを確認しましたが、winRar を使用して開くことができるからではありません。
だから私は先に進み、appache.commons.vfs
パッケージで同じことをしようとしましたが、それも失敗しました。
最後の試みとして、ライブラリ 7-zip-jbinding を試してみました。これは Zip アーカイブの内容を読み取ることができますが、抽出することはできません。
ネイティブ Java 実装のコードは次のとおりです。
BufferedOutputStream dest = null;
FileInputStream fis = new FileInputStream(archive);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
File destFile;
destinationDir.mkdir();
while ((entry = zis.getNextEntry()) != null) {
String currentfileName = entry.getName();
destFile = new File(destinationDir, currentfileName);
File destinationParent = destFile.getParentFile();
destinationParent.mkdirs();
if (!entry.isDirectory()) {
int currentByte;
byte data[] = new byte[BUFFER_SIZE];
FileOutputStream fos = new FileOutputStream(destFile);
dest = new BufferedOutputStream(fos, BUFFER_SIZE);
while ((currentByte = zis.read(data, 0, BUFFER_SIZE)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
}
}
fis.close();
zis.close();
apache commons vfsの私のコード
public void unpack(final File outputDir,URI packLocation) throws IOException
{
this.packLocation = packLocation;
this.fileSystemManager = VFS.getManager();
outputDir.mkdirs();
final FileObject packFileObject = fileSystemManager.resolveFile(packLocation.toString());
try
{
final FileObject zipFileSystem = fileSystemManager.createFileSystem(packFileObject);
try
{
fileSystemManager.toFileObject(outputDir).copyFrom(zipFileSystem, new AllFileSelector());
}
finally
{
zipFileSystem.close();
}
}
finally
{
packFileObject.close();
}
}
私が欠けていることが非常に明白なものはありますか?また、zip ファイルをファイル システムに抽出するために 7-zip-jbinding を使用したことがある場合は、その方法を教えてください。
編集1:
そのファイルのMac端末で解凍を実行しているときに、次の警告が表示されました
警告: zipfile の先頭または内部に 84 バイトの余分なバイトがあります。これは Zip 入力ストリームに何らかの影響を与える可能性がありますか?
編集2:
zip ファイル内の余分なバイトは、zip 入力ストリームを台無しにしているように見えました..端末で unzip を使用すると、zip ファイルに追加された余分なバイト数が表示されます。RandomAccessFile を使用して (n) バイトをスキップすると、Zip 入力ストリームが正常に動作し始めました..あとは、Zip ファイルの余分なバイトを削除する方法を見つけるだけです..
編集されたコードは、将来それから利益を得る人のために以下に貼り付けられます.
final int BUFFER_SIZE = 1024;
RandomAccessFile randomAccessFile = new RandomAccessFile(archive, "r");
randomAccessFile.skipBytes(84); // The extra bytes
FileChannel channel = randomAccessFile.getChannel();
BufferedOutputStream dest = null;
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(Channels.newInputStream(channel)));
ZipEntry entry;
File destFile;
destinationDir.mkdir();
while ((entry = zis.getNextEntry()) != null) {
String currentfileName = entry.getName();
destFile = new File(destinationDir, currentfileName);
File destinationParent = destFile.getParentFile();
destinationParent.mkdirs();
if (!entry.isDirectory()) {
int currentByte;
byte data[] = new byte[BUFFER_SIZE];
FileOutputStream fos = new FileOutputStream(destFile);
dest = new BufferedOutputStream(fos, BUFFER_SIZE);
while ((currentByte = zis.read(data, 0, BUFFER_SIZE)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
}
}
zis.close();
誰かが余分なバイトをスキップする方法を知っているなら、私はすべての耳です:)