"Xin chào, Amigo! Hôm nay chúng ta sẽ một lần nữa tìm hiểu cách hoạt động của InputStreamOutputStream . Giải thích ban đầu thực sự hơi đơn giản. Đây không phải là các giao diện. Chúng là các lớp trừu tượng và thậm chí chúng còn có một vài phương thức được triển khai. Chúng ta hãy xem các phương pháp họ có:"

Các phương thức InputStream Phương pháp làm gì
int read(byte[] buff);
Phương thức này ngay lập tức đọc một khối byte vào bộ đệm ( mảng byte ), cho đến khi bộ đệm đầy hoặc cho đến khi nguồn không còn byte nào để đọc.
Phương thức trả về số byte thực sự được đọc (có thể nhỏ hơn độ dài của mảng)
int read();
Phương thức này đọc một byte và trả về nó. Kết quả được mở rộng thành một int cho ngoại hình. Nếu không còn byte nào để đọc, phương thức sẽ trả về -1.
int available();
Phương thức này trả về số byte chưa đọc (có sẵn).
void close();
Phương thức này «đóng» luồng. Bạn gọi điều này khi bạn làm việc xong với luồng.
Sau đó, đối tượng thực hiện các thao tác quản lý cần thiết để đóng tệp, v.v.
Tại thời điểm này, bạn không thể đọc thêm bất kỳ dữ liệu nào từ luồng.

"Vì vậy, chúng tôi có thể đọc không chỉ các byte đơn lẻ mà còn cả khối?"

"Chính xác."

"Chúng ta cũng có thể viết cả khối sao?"

"Ừ, xem đi:"

Các phương thức OutputStream Phương pháp làm gì
void write(int c);
Phương thức này ghi một byte. Loại int được thu hẹp thành một byte. Phần bổ sung chỉ đơn giản là loại bỏ.
void write(byte[] buff);
Phương thức này ghi một khối byte.
void write(byte[] buff, int from, int count);
Phương thức này ghi một phần của khối byte. Nó được sử dụng trong trường hợp mảng byte có thể không được lấp đầy hoàn toàn.
void flush();
Nếu luồng đang lưu trữ nội bộ bất kỳ dữ liệu nào chưa được ghi, thì phương thức này buộc nó phải được ghi.
void close();
Phương thức này «đóng» luồng. Bạn gọi điều này khi bạn làm việc xong với luồng.
Sau đó, đối tượng thực hiện các thao tác quản lý cần thiết để đóng tệp, v.v. Bạn không thể ghi dữ liệu vào luồng nữa và chức năng xả được gọi tự động.

"Mã sao chép tệp sẽ trông như thế nào nếu chúng ta đọc toàn bộ khối cùng một lúc thay vì từng byte?"

"Hừm. Đại loại thế này:"

Sao chép một tập tin trên đĩa
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"Tôi hiểu mọi thứ về bộ đệm, nhưng biến đếm này là gì?"

"Khi chúng tôi đọc khối dữ liệu mới nhất từ ​​một tệp, chúng tôi có thể nhận được 328 byte thay vì 1000. Vì vậy, khi chúng tôi ghi dữ liệu, chúng tôi cần chỉ ra rằng chúng tôi không ghi toàn bộ khối—chỉ 328 byte đầu tiên byte."

Khi chúng ta đọc khối cuối cùng, phương thức read sẽ trả về số byte thực sự được đọc. 1000 mỗi khi chúng tôi đọc một khối, ngoại trừ khối cuối cùng, khi chúng tôi nhận được 328.

Vì vậy, khi chúng tôi viết một khối, chúng tôi chỉ ra rằng không phải tất cả các byte trong bộ đệm sẽ được ghi, chỉ 328 (tức là giá trị được lưu trữ trong biến đếm).

"Giờ thì mọi chuyện đã rõ ràng. Cảm ơn, Ellie."