「こんにちは、アミーゴ!」

「こんにちは、エリー!」

「今日は I/O ストリームについて勉強します。」

「はい、それらについてはすでにすべて知っています。ここでは FileInputStream クラスと FileOutputStream クラスを使用します。」

「はい、これらのクラスのメソッドのうちどれを知っていますか?」

「はい。FileInputStream のメソッドは次のとおりです。」

方法 説明
int read() 1バイトを読み取って返します。
int read(byte b[]) バイト配列を読み取って返します。
int read(byte b[], int off, int len) ストリームからバイト配列を読み取ります。
long skip(long n) n バイトをスキップします。ストリームからの読み取り時に使用されます。
int available() ストリームからまだ読み取ることができるバイト数を返します。
void close() ストリームを閉じます。

「わかりました! FileOutputStream のメソッドは?」

「見てください:」

方法 説明
void write(int b) ストリームに 1 バイトを書き込みます。
void write(byte b[]) バイト配列をストリームに書き込みます。
void write(byte b[], int off, int len) バイト配列をストリームに書き込みます。
void close() ストリームを閉じます。

「アミーゴ、あなたは私を驚かせました!」

"そしてその後、いくつかの!"

「わかりました。それでは、ZipInputStream と ZipOutputStream という 2 つの新しいクラスを提供します。」

FileInputStream、FileOutputStream、ZipOutputStream、ZipInputStream - 1

Zip?zipファイルのようなものですか?」

「その通りです。これらのストリームは zip ファイルで動作するように設計されています。これらのストリームを使用して、zip ファイルを直接読み書きすることができます。」

「なんと、興味深いですね。でも、zip ファイルには 1 つのファイルではなく、複数のファイルを含めることができます。どのように機能するのでしょうか?」

「そのために、別の特別なクラスZipEntryがあります。これは、アーカイブに保存されているファイルを表します。ZipEntryオブジェクトはZipInputStreamから読み取ることしかできず、ZipEntryオブジェクトはZipOutputStreamに書き込むことしかできません。しかし、読み取りと書き込みができることがわかりました。通常のファイルと同じようにZipEntryに書き込みます。」

「それがどのように機能するかの例を教えていただけますか?」

「もちろんです。アーカイブを作成してそこにファイルを置く例を次に示します。」

コード
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

「なんと興味深いことでしょう。ファイルの解凍も同じくらい簡単ですか?」

「はい。ここでは、 ZipEntryZipInputStream   、およびZipOutputStreamクラスのメソッドについて簡単に説明します。」

" ZipInputStream はストリームであるため、すべてのZipEntry は順次にのみ読み取ることができます。そのメソッドは次のとおりです。"

方法 説明
ZipEntry getNextEntry() 次の ZipEntry を記述するオブジェクトを返します (現在のエントリのすべてのバイトをスキップします)。
void closeEntry() 現在の ZipEntry の入力ストリームを閉じます (現在のエントリのすべてのバイトをスキップします)。
int available() 使用可能な ZipEntries がある場合は 1 を返し、それ以外の場合は 0 を返します。
int read(byte[] b, int off, int len) 現在の ZipEntry からバイトを読み取ります。
long skip(long n) ストリームからの読み取り時に n バイトをスキップします。
void close() ストリームを閉じます。

「よくわかりません。」

"最も良い方法は、テキスト ファイルを読んでいると想像することです。ZipEntries はファイル内の行のようなものです。現在の行 (現在の ZipEntry ) からデータを読み取ることも、行から行にジャンプすることもできます( getNextEntrycloseEntry ) 。」

「理解しているつもりですが、よくわかりません。」

「ZipOutputStream とそのメソッドは次のとおりです。」

方法 説明
void setComment(String comment) アーカイブにコメントを設定します。
void setMethod(int method) 圧縮方式(種類)を設定します。
void setLevel(int level) 圧縮レベルを設定します。圧縮が高くなるほど、速度は遅くなります。
void putNextEntry(ZipEntry e) 新しい ZipEntry を追加します。
void closeEntry() 現在の ZipEntry を閉じます
void write(byte[] b, int off, int len) 一連のバイトを現在の ZipEntry に書き込みます。
void close() ストリームを閉じます。

「しかし、上の例では、これをほとんど使用していません。」

「これらはオプションの方法です。圧縮レベルと方法を指定する必要はありません。デフォルトの設定が使用されます。」

「うーん。それは悪くない。それで ZipEntry は?」

「そうですね。ZipEntry に含まれるその他の情報はハウスキーピング情報だけです。」

方法 説明
String getName(), setName(String) 内部名ファイル。
long getTime(), setTime(long) エントリが最後に変更された時刻。
long getCRC(), setCRC(long) チェックサム。
long getSize(), setSize(long) 圧縮前のサイズ。
int getMethod(), setMethod(int) 圧縮方法。
long get/setCompressedSize() ファスナーを閉めた後のサイズ。
boolean isDirectory() エントリはディレクトリですか?

「それはそれほど難しいことではありません。愛にないものは何ですか!」

「わかりました。では、ディエゴがこのテーマについてもあなたにタスクを与えます。」

「口を閉ざしておけば良かった。」