"Chúng ta sẽ bắt đầu với các luồng cho tệp đầu vào/đầu ra. Nhưng điều đầu tiên cần làm trước."

Có hai lớp để đọc và ghi tệp: FileInputStreamFileOutputStream . Như bạn có thể đã đoán, FileInputStream có thể đọc tuần tự các byte từ một tệp và FileOutputStream có thể ghi tuần tự các byte vào một tệp. Dưới đây là các phương thức mà các lớp này có:

Phương pháp Phương pháp làm gì
FileInputStream(String fileName);
- Đây là hàm tạo. Nó cho phép bạn chỉ định tên của một tệp trên đĩa, từ đó đối tượng được tạo sẽ đọc dữ liệu.
int read();
— Phương thức này đọc một byte từ tệp và trả về nó. Giá trị trả về được mở rộng thành một int.
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.

Để giải trí, hãy tính tổng của tất cả các byte trong một tệp. Đây là mã trông như thế nào:

Tổng hợp tất cả các byte trong một tệp
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

"Chúng tôi đã xem xét một số thứ như thế này. FileOutputStream được tổ chức như thế nào?"

"OK. Nhìn này:"

Phương pháp Phương pháp làm gì
FileOutputStream (String fileName);
"Đây là hàm tạo. Nó cho phép bạn chỉ định tên của tệp trên đĩa mà đối tượng được tạo sẽ ghi dữ liệu."
void write(int data);
"Phương pháp này ghi byte tiếp theo, cắt bớt dữ liệu thành một byte."
void flush();
"Dữ liệu được ghi trước tiên thường được thu thập trong các khối lớn trong bộ nhớ và sau đó chỉ được ghi vào đĩa."

Lệnh flush buộc tất cả thông tin chưa lưu được ghi vào đĩa.

void close();
"Phương thức này «đóng» luồng. Bạn gọi phương thức này khi bạn hoàn thành công việc 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.

"Đó là nó?"

"Đúng vậy, thực ra chỉ có một phương thức để viết: write(). Nó chỉ ghi một byte mỗi lần. Nhưng nó cho phép bạn ghi bao nhiêu thông tin tùy thích vào tệp."

Lập trình là một quá trình chia một nhiệm vụ lớn và phức tạp thành nhiều nhiệm vụ nhỏ. Về cơ bản, quy trình tương tự đang diễn ra ở đây: việc đọc và ghi các khối dữ liệu lớn được chia thành các phần đọc và ghi có kích thước nhỏ—mỗi lần một byte.

Đây là cách bạn có thể sử dụng các lớp này để sao chép tệp trên đĩa:

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");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

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

"Cảm ơn, Rishi. Cuối cùng tôi cũng hiểu mã này thực sự hoạt động như thế nào."