私はjava.io.InputStream
にZIPデータが含まれているかどうかを調べる最良の方法は何ですか?ストリームがJavaで圧縮されているかどうかを検出する最も良い方法
答えて
ZIPフォーマットのmagic bytesは、50 4B
です。ストリームをテストすることができます(markとresetを使用する必要があります - bufferにする必要があります)が、これは100%信頼できるアプローチであるとは思わないでしょう。 PK
という文字で始まるUS-ASCIIでエンコードされたテキストファイルと区別する方法はありません。
の方法では、ストリームを開く前にメタデータをコンテンツ形式に提供し、適切に処理することができます。
非常にエレガントな、しかし信頼性がない:ストリームがZipInputStream
経由で読み取ることができる場合
、それがZIP形式でなければなりません。
あなたは、ストリームの最初の4つのバイトが50 4B 03 04
すべきZIPファイル内のすべてのファイルを移行ローカルファイルヘッダ、as shown in the spec hereを開始ローカルファイルヘッダ署名であることを確認できました。
少しテストコードは、これは動作する例を示します。すべての答えは、私が感じる5歳なので
50 4B 3 4
私は同じアイディアを持っていましたが(恥ずかしながら、信頼できるWikipediaですが)、これは信頼できるメカニズムではないようです:_ "実装者は、ZIPファイルがこの署名マーキングデータ記述子の有無にかかわらず互換性を保証するためにZIPファイルを読むときにどちらのケースも考慮する必要があります。 "_ – McDowell
これは一般的な見解に当てはまりますが、ZipInputStreamがZipEntryオブジェクトを主張しているので、署名がない場合は失敗します。 –
zipファイル(Microsoft Windows実行ファイルなど)の前にランダムなジャンクを付けることができます。ローカルヘッダーでストリーミングするのではなく、セントラルディレクトリを使用する場合にのみ機能します。 FWIW、Java PlugInとWebStartは中央ディレクトリを使用しますが、最初の4バイトもチェックします(GIARを参照)。 –
はじめ
:
byte[] buffer = new byte[4];
try {
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("so.zip"));
ZipEntry ze = new ZipEntry("HelloWorld.txt");
zos.putNextEntry(ze);
zos.write("Hello world".getBytes());
zos.close();
FileInputStream is = new FileInputStream("so.zip");
is.read(buffer);
is.close();
}
catch(IOException e) {
e.printStackTrace();
}
for (byte b : buffer) {
System.out.printf("%H ",b);
}
が私にこの出力を与えました書き留める義務、今日起こっていること。私は真剣にストリームの魔法のバイトを読むべきであると疑う!それは低レベルのコードなので、一般的に避けるべきです。
単純な答え
ミクは書いている:
ストリームはZipInputStreamを経由して読み取ることができれば、それはzip形式で圧縮されなければなりません。
はい、しかしZipInputStream
の場合に「読み取ることができる」.getNextEntry()
の最初の呼び出しが非ヌル値を返すことを意味します。例外をキャッチすることはありません。だから、代わりにあなたを解析する魔法のバイトだけで行うことができます。
boolean isZipped = new ZipInputStream(yourInputStream).getNextEntry() != null;
そして、それはそれです!一般的に考え
を解凍
一般的には、[UN]ストリームよりも、ビュンながら、ファイルを操作するためにはるかに便利だと思われました。便利なライブラリがいくつかありますが、ZipFileにはZipInputStreamよりも多くの機能があります。 zipファイルの取り扱いについては、こちらを参照してください。What is a good Java library to zip/unzip files?ファイルで作業することができれば、より効果的です!私は唯一のストリームで動作するように自分のアプリケーションに必要な
コードサンプル
。だから私は解凍のために書いた方法です:
import org.apache.commons.io.IOUtils;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public boolean unzip(InputStream inputStream, File outputFolder) throws IOException {
ZipInputStream zis = new ZipInputStream(inputStream);
ZipEntry entry;
boolean isEmpty = true;
while ((entry = zis.getNextEntry()) != null) {
isEmpty = false;
File newFile = new File(outputFolder, entry.getName());
if (newFile.getParentFile().mkdirs() && !entry.isDirectory()) {
FileOutputStream fos = new FileOutputStream(newFile);
IOUtils.copy(zis, fos);
IOUtils.closeQuietly(fos);
}
}
IOUtils.closeQuietly(zis);
return !isEmpty;
}
'ZipOutputStream'が正しく終了していないか閉じている状況があります。これは、無効なため、新しいZipFile(f)に解析されたときに結果ファイルが' IOException'をスローすることを意味します。 zipファイルが他の目的のために無効であっても、上記は失敗しません。 –
マジックナンバーをチェックするのは正しい選択ではないかもしれません。
Docxファイルも同様のマジックナンバー50 4B 3 4
これは、docxファイルがzipファイルであるためです。 – tak3shi
- 1. RailsとApacheで出力を圧縮する最良の方法
- 2. JavascriptでYIU圧縮プログラムでjavascriptを圧縮しているかどうかを検出します。
- 3. 圧縮されていないzlibストリームとどのようにファイルが分かれているか
- 4. アプリケーションサーバーでコードが実行されているかどうかを検出する最善の方法java
- 5. Windowsフォームアプリケーションでメモリリークを検出する最も良い方法は何ですか?
- 6. 衝突検出を行う最も良い方法は何ですか?
- 7. コードイグナイター - ブラウザを検出する最も良い方法
- 8. PHPで文字列を圧縮する最良の方法
- 9. Excel 2003がインストールされているかどうかを検出する最善の方法は何ですか?
- 10. Zebraプリンタがインストールされているかどうかを検出する方法
- 11. 良いJavaオーディオ圧縮ライブラリをお探しですか?
- 12. mp3が圧縮されているのはなぜですか?
- 13. なぜフォルダを圧縮してもサイズが圧縮されないのですか?
- 14. 画像を最もスマートな方法で圧縮する
- 15. ページから.js.erbを抽出する最も良い方法
- 16. ロスレスJPEG 2000圧縮を検出するにはどうすればいいですか?
- 17. ストリームから直接圧縮
- 18. 入力ボックスで何も変更されていないかどうかを検出する方法
- 19. Memcache圧縮 - 良い/悪い?
- 20. アプリケーションクラッシュを検出して再起動する最も良い方法は?
- 21. IIS圧縮が無効になっているのにScriptResource.axdが圧縮されるのはなぜですか?
- 22. Javaで画像を拡大縮小する最も良い方法は何ですか?
- 23. TextViewのテキストが変更されたかどうかを検出する最良の方法は?
- 24. apache圧縮圧縮されていない.jsファイルと.cssファイルを圧縮解除しますか?
- 25. EditTextが以前に選択されたかどうかを判断する最も良い方法
- 26. Python ftplib:ファイルが変更されたかどうかを確認する最も良い方法は?
- 27. PHPだけで圧縮されていない画像のみを圧縮するにはどうすればいいですか?
- 28. パフォーマンスの面でJSON文字列を圧縮し、ラジオを圧縮するための最良の方法
- 29. フラスコビューでユーザーアクションを記録する最も良い方法はどれですか?
- 30. Asp.Netでログオフボタンを実装する最も良い方法はどれですか?
このリクエストはHTTPリクエスト/レスポンスの一部ですか? –