"Xin chào, Amigo! Bây giờ tôi sẽ cho bạn biết về hai giao diện: InputStreamOutputStream . Chúng được khai báo là các lớp trừu tượng, nhưng nếu bạn tìm hiểu sâu hơn, bạn có thể thấy rằng chúng thực chất là các giao diện . Hầu như tất cả các phương thức của chúng đều là trừu tượng, ngoại trừ một vài phương pháp không đáng kể. Chúng rất giống với " vệ sĩ " mà chúng ta đã xem xét trước đó."

Đây là những giao diện rất thú vị. Hiện tại, tôi sẽ cố tình gọi chúng là giao diện để bạn hiểu tại sao chúng ta cần chúng. Và sau đó chúng ta sẽ nói về lý do tại sao chúng thực sự là các lớp trừu tượng.

"Được rồi. Vậy những giao diện này là gì?"

"Ta sẽ nói cho ngươi biết ngay."

Java có một thứ thú vị được gọi là « stream ». Luồng là một thực thể rất đơn giản. Và sự đơn giản của nó là chìa khóa cho một phương pháp trao đổi dữ liệu rất hiệu quả. Có hai loại luồng: luồng để đọc và luồng để ghi .

Như bạn có thể đã đoán, bạn có thể ghi dữ liệu vào luồng để ghi tệp . Nó có một phương pháp viết cho việc này. Bạn có thể đọc dữ liệu từ một luồng để đọc . Nó có một phương thức read () cho việc này.

InputStream  là giao diện cho luồng hỗ trợ đọc. Nó xác định khả năng sau: «byte có thể được đọc từ tôi».

Tương tự, OutputStream , một OutputStream là một giao diện cho luồng hỗ trợ ghi. Nó xác định khả năng sau: «byte có thể được ghi cho tôi».

"Đó là nó?"

"Khá nhiều. Nhưng điểm chung là Java có vô số lớp có thể hoạt động với InputStreamOutputStream . Ví dụ: bạn muốn đọc một tệp từ đĩa và hiển thị nội dung của nó trên màn hình. Không gì có thể dễ dàng hơn."

Để đọc dữ liệu từ một tệp trên đĩa, chúng ta có lớp FileInputStream đặc biệt , lớp này triển khai giao diện InputStream . Bạn có muốn ghi dữ liệu này vào một tệp khác không? Đối với điều này, chúng ta có lớp FileOutputStream , thực hiện giao diện OutputStream . Đoạn mã sau cho biết bạn cần làm gì để sao chép dữ liệu từ tệp này sang tệp khác.

Mã số
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

Tưởng tượng rằng chúng ta đã viết một lớp và thêm  các khả năng InputStream  và  OutputStream vào lớp đó.

Nếu chúng ta triển khai đúng các giao diện này, thì các thể hiện của lớp chúng ta giờ đây có thể được lưu vào hoặc đọc từ một tệp. Đơn giản bằng cách đọc nội dung của chúng bằng phương thức read . Hoặc chúng có thể được tải từ một tệp bằng cách tạo một đối tượng và sử dụng phương thức ghi để ghi nội dung tệp.

"Có thể là một ví dụ?"

"Chắc chắn."

Mã số Sự miêu tả
class MyClass
{
private ArrayList<Integer> list;
}
Để đơn giản, hãy tưởng tượng rằng lớp của chúng ta chứa một đối tượng, một ArrayList chứa các số nguyên.

Bây giờ chúng ta sẽ thêm các phương thức đọc và ghi vào nó

Mã số Sự miêu tả
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
Bây giờ lớp của chúng ta triển khai phương thức read , cho phép đọc tuần tự toàn bộ nội dung của list .

Và phương thức ghi , cho phép bạn ghi các giá trị vào danh sách của chúng tôi.

Tất nhiên, đây không phải là sự triển khai của các giao diện InputStream và OutputStream, nhưng nó rất giống nhau.

"Vâng, tôi hiểu. Vậy làm thế nào để bạn lưu nội dung của một đối tượng như vậy vào một tập tin?"

"Tôi sẽ cho bạn một ví dụ:"

Viết một đối tượng MyClass vào một tệp
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
Đọc một đối tượng MyClass từ một tệp
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"Chúa ơi! Nó thực sự rất giống với cách làm việc với InputStream/OutputStream. Các luồng thật ngọt ngào!"

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