“嗨,阿米戈!”

“嗨,艾莉!”

“今天我們要研究I/O流。”

“是的,我已經對它們一清二楚了。我們這裡使用的是FileInputStream和FileOutputStream類。”

“是的,你知道這些課程中的哪些方法?”

“當然。這是 FileInputStream 的方法:”

方法 描述
int read() 讀取一個字節並返回它。
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) 向流中寫入一個字節。
void write(byte b[]) 將字節數組寫入流。
void write(byte b[], int off, int len) 將字節數組寫入流。
void close() 關閉流。

“阿米戈,你讓我驚喜!”

“然後還有一些!”

“好吧,那我給你兩個新類:ZipInputStream 和 ZipOutputStream。”

文件輸入流、文件輸出流、ZipOutputStream、ZipInputStream - 1

Zip?那是像一個 zip 文件嗎?”

“完全正確。這些數據流是為處理 zip 文件而設計的。您可以使用它們直接讀取或寫入 zip 文件!”

“我的天啊!真有趣。但是一個 zip 文件不能有一個文件,而是多個文件。它們是如何工作的?”

“為此,還有另一個特殊的類:ZipEntry。它提供了一個存儲在存檔中的文件。您只能從 ZipInputStream讀取ZipEntry對象,並且只能將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() 返回 1 有可用的 ZipEntries,否則返回 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() 條目是目錄嗎?

“這看起來並不難。有什麼可以不去愛的!”

“太好了,那迪亞哥也給你佈置這方面的任務。”

“我應該閉嘴。”