「こんにちは、アミーゴ!」
「こんにちは、エリー!」
「今日は 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 つの新しいクラスを提供します。」

「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();
「なんと興味深いことでしょう。ファイルの解凍も同じくらい簡単ですか?」
「はい。ここでは、 ZipEntry、ZipInputStream 、および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 ) からデータを読み取ることも、行から行にジャンプすることもできます( getNextEntry、closeEntry ) 。」
「理解しているつもりですが、よくわかりません。」
「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() |
エントリはディレクトリですか? |
「それはそれほど難しいことではありません。愛にないものは何ですか!」
「わかりました。では、ディエゴがこのテーマについてもあなたにタスクを与えます。」
「口を閉ざしておけば良かった。」
GO TO FULL VERSION