“嗨,阿米戈!”
“嗨,艾莉!”
“今天我們要研究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。”
“ 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();
“多麼有趣!解壓縮文件也一樣容易嗎?”
“是的。這裡是ZipEntry、ZipInputStream 和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 )讀取數據或從一行跳到另一行(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