"Chào, Amigo!"

"Chào, Ellie!"

"Hôm nay chúng ta sẽ nghiên cứu về luồng I/O."

"Vâng, tôi đã biết mọi thứ về chúng. Chúng tôi sử dụng các lớp FileInputStream và FileOutputStream ở đây."

"Yep, và bạn biết phương thức nào trong số các lớp này?"

"Chắc chắn rồi. Đây là các phương thức của FileInputStream:"

Phương pháp Sự miêu tả
int read() Đọc một byte và trả về nó.
int read(byte b[]) Đọc một mảng byte và trả về nó.
int read(byte b[], int off, int len) Đọc một mảng byte từ luồng.
long skip(long n) Bỏ qua n byte, được sử dụng khi đọc từ luồng.
int available() Trả về số byte vẫn có thể được đọc từ luồng.
void close() Đóng luồng.

"Bật lên! Và các phương thức của FileOutputStream?"

"Hãy nhìn xem:"

Phương pháp Sự miêu tả
void write(int b) Ghi một byte vào luồng.
void write(byte b[]) Ghi một mảng byte vào luồng.
void write(byte b[], int off, int len) Ghi một mảng byte vào luồng.
void close() Đóng luồng.

"Amigo, anh làm em ngạc nhiên đấy!"

"Và sau đó, vài!"

"Được, vậy tôi sẽ cung cấp cho bạn hai lớp mới: ZipInputStream và ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Nó giống như một tệp zip?"

"Chính xác. Các luồng này được thiết kế để hoạt động với các tệp zip. Bạn có thể sử dụng chúng để đọc hoặc ghi trực tiếp vào tệp zip!"

"Holy moly! Thật thú vị. Nhưng một tệp zip không thể có một tệp mà là nhiều tệp. Chúng hoạt động như thế nào?"

"Đối với điều đó, có một lớp đặc biệt khác: ZipEntry . Nó trình bày một tệp được lưu trữ trong kho lưu trữ. Bạn chỉ có thể đọc các đối tượng ZipEntry từ ZipInputStream bạn chỉ có thể ghi các đối tượng ZipEntry vào ZipOutputStream . Nhưng hóa ra bạn có thể đọc và ghi vào ZipEntry giống như một tệp thông thường."

"Bạn có thể cho tôi một ví dụ về cách thức hoạt động của nó không?"

"Tất nhiên. Đây là một ví dụ mà chúng tôi tạo một kho lưu trữ và đặt một tệp vào đó:"

Mã số
// 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();

"Thật thú vị! Và việc giải nén các tập tin có dễ dàng không?"

"Yep. Đây là mô tả ngắn gọn về các phương thức của các lớp ZipEntry , ZipInputStream   và ZipOutputStream "

" ZipInputStream là một luồng, vì vậy tất cả ZipEntry chỉ có thể được đọc tuần tự. Đây là các phương pháp của nó:"

Phương pháp Sự miêu tả
ZipEntry getNextEntry() Trả về một đối tượng mô tả ZipEntry tiếp theo (bỏ qua tất cả các byte trong mục nhập hiện tại).
void closeEntry() Đóng luồng đầu vào trên ZipEntry hiện tại (bỏ qua tất cả các byte trong mục nhập hiện tại).
int available() Trả về 1 nếu có ZipEntries, nếu không thì 0.
int read(byte[] b, int off, int len) Đọc byte từ ZipEntry hiện tại.
long skip(long n) Bỏ qua n byte khi đọc từ luồng.
void close() Đóng luồng.

"Tôi thực sự không hiểu."

"Điều tốt nhất cần làm là tưởng tượng rằng bạn đang đọc một tệp văn bản và ZipEntries giống như các dòng trong tệp. Bạn có thể đọc dữ liệu từ dòng hiện tại ( ZipEntry hiện tại) hoặc nhảy từ dòng này sang dòng khác ( getNextEntry , closeEntry ) ."

"Tôi nghĩ là tôi hiểu, nhưng tôi không chắc lắm."

"Đây là ZipOutputStream và các phương thức của nó:"

Phương pháp Sự miêu tả
void setComment(String comment) Đặt nhận xét về kho lưu trữ.
void setMethod(int method) Đặt phương pháp nén (loại).
void setLevel(int level) Đặt mức độ nén. Độ nén càng cao thì càng chậm.
void putNextEntry(ZipEntry e) Thêm một ZipEntry mới.
void closeEntry() Đóng ZipEntry hiện tại
void write(byte[] b, int off, int len) Ghi một tập hợp byte vào ZipEntry hiện tại.
void close() Đóng luồng.

"Nhưng trong ví dụ trên, chúng tôi hầu như không sử dụng điều này."

"Đây là các phương pháp tùy chọn. Bạn không phải chỉ định mức độ nén và phương pháp—cài đặt mặc định sẽ được sử dụng."

"Hmm. Điều đó không tệ lắm. Còn ZipEntry?"

"Chắc chắn rồi. Thông tin duy nhất khác trong ZipEntry là thông tin quản lý nhà cửa:"

Phương pháp Sự miêu tả
String getName(), setName(String) Tệp tên nội bộ.
long getTime(), setTime(long) Lần cuối mục đã được sửa đổi.
long getCRC(), setCRC(long) Tổng kiểm tra.
long getSize(), setSize(long) Kích thước trước khi nén.
int getMethod(), setMethod(int) Phương pháp nén.
long get/setCompressedSize() Kích thước sau khi kéo khóa.
boolean isDirectory() Mục nhập có phải là một thư mục không?

"Điều đó có vẻ không khó lắm. Không có gì để yêu!"

"Tuyệt vời, sau đó Diego cũng sẽ giao cho bạn nhiệm vụ về chủ đề này."

"Đáng lẽ tôi nên ngậm miệng lại."