"Xin chào, Amigo! Bây giờ tôi sẽ cho bạn biết về hai giao diện: InputStream và OutputStream . 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 InputStream và OutputStream . 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.
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ả |
---|---|
|
Để đơ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ả |
---|---|
|
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ụ:"
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();
}
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!"
GO TO FULL VERSION