Trong hướng dẫn này, chúng ta sẽ tìm hiểu về ObjectOutputStream trong Java và các phương thức của nó với sự trợ giúp của các ví dụ.

Các lớp ObjectInputStream của gói java.io có thể được sử dụng để đọc các đối tượng mà trước đây được viết bởi ObjectOutputStream.

Nó mở rộng lớp InputStream trừu tượng.

Trước khi bạn tìm hiểu về lớp ObjectInputStream, hãy đảm bảo rằng bạn biết về Lớp ObjectOutputStream .

1. Hoạt động của ObjectInputStream

Chủ ObjectInputStream yếu được sử dụng để đọc dữ liệu được viết bởi ObjectOutputStream.

Về cơ bản, các đối tượng ObjectOutputStream trong Java chuyển đổi thành các luồng tương ứng. Đây được gọi là tuần tự hóa. Các luồng chuyển đổi đó có thể được lưu trữ trong các tệp hoặc chuyển qua mạng.

Bây giờ, nếu chúng ta cần đọc những đối tượng đó, chúng ta sẽ sử dụng ObjectInputStream nó sẽ chuyển đổi các luồng trở lại các đối tượng tương ứng. Điều này được gọi là deserialization.

2. Tạo một ObjectInputStream

Để tạo luồng đầu vào đối tượng, trước tiên chúng ta phải nhập gói. java.io.ObjectInputStream Sau khi chúng tôi nhập gói, đây là cách chúng tôi có thể tạo luồng đầu vào.

// Creates a file input stream linked with the specified file
FileInputStream fileStream = new FileInputStream(String file);

// Creates an object input stream using the file input stream
ObjectInputStream objStream = new ObjectInputStream(fileStream);

Trong ví dụ trên, chúng ta đã tạo một luồng đầu vào đối tượng có tên objStream được liên kết với luồng đầu vào tệp có tên tập hồ sơ.

Bây giờ, objStream có thể được sử dụng để đọc các đối tượng từ tệp.

3. Các phương thức của ObjectInputStream

lớp ObjectInputStream cung cấp triển khai các phương thức khác nhau trình bày trong lớp InputStream.

4. phương thức read ()

  • read() – đọc một byte dữ liệu từ luồng đầu vào
  • readBoolean() – đọc dữ liệu ở dạng boolean
  • readChar() – đọc dữ liệu ở dạng ký tự
  • readInt() – đọc dữ liệu ở dạng số nguyên
  • readObject() – đọc đối tượng từ luồng đầu vào

4.1 Ví dụ 1: Java ObjectInputStream

Hãy xem cách chúng ta có thể sử dụng lớp ObjectInputStream để đọc các đối tượng được viết bởi lớp ObjectOutputStream.

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Main {
    public static void main(String[] args) {

        int data1 = 5;
        String data2 = "This is programiz";

        try {
            FileOutputStream file = new FileOutputStream("file.txt");
            ObjectOutputStream output = new ObjectOutputStream(file);

            // Writing to the file using ObjectOutputStream
            output.writeInt(data1);
            output.writeObject(data2);

            FileInputStream fileStream = new FileInputStream("file.txt");
            // Creating an object input stream
            ObjectInputStream objStream = new ObjectInputStream(fileStream);

            //Using the readInt() method
            System.out.println("Integer data :" + objStream.readInt());

            // Using the readObject() method
            System.out.println("String data: " + objStream.readObject());

            output.close();
            objStream.close();
        }
        catch (Exception e) {
            e.getStackTrace();
        }
    }
}

Đầu ra

Integer data: 5
String data: This is programiz

Trong ví dụ trên, chúng ta đã sử dụng phương thức readInt()và readObject()để đọc dữ liệu số nguyên và dữ liệu đối tượng từ tệp.

Ở đây, chúng ta đã sử dụng ObjectOutputStream để ghi dữ liệu vào tệp. Sau đó, chúng tôi đọc dữ liệu từ tệp bằng cách sử dụng ObjectInputStream.

4.2 Ví dụ 2: Java ObjectInputStream

Hãy xem một ví dụ thực tế khác,

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Dog implements Serializable {

    String name;
    String breed;

    public Dog(String name, String breed) {
        this.name = name;
        this.breed = breed;
    }
}

class Main {
    public static void main(String[] args) {

        // Creates an object of Dog class
        Dog dog = new Dog("Tyson", "Labrador");

        try {
            FileOutputStream file = new FileOutputStream("file.txt");

            // Creates an ObjectOutputStream
            ObjectOutputStream output = new ObjectOutputStream(file);

            // Writes objects to the output stream
            output.writeObject(dog);

            FileInputStream fileStream = new FileInputStream("file.txt");

            // Creates an ObjectInputStream
            ObjectInputStream input = new ObjectInputStream(fileStream);

            // Reads the objects
            Dog newDog = (Dog) input.readObject();

            System.out.println("Dog Name: " + newDog.name);
            System.out.println("Dog Breed: " + newDog.breed);

            output.close();
            input.close();
        }

        catch (Exception e) {
            e.getStackTrace();
        }
    }
}

Đầu ra

Dog Name: Tyson
Dog Breed: Labrador

Trong ví dụ trên, chúng tôi đã tạo

  • ObjectOutputStream được đặt tên đầu ra sử dụng FileOutputStreamtêntập tin
  • ObjectInputStream được đặt tên đầu vào sử dụng FileInputStream tên là tập hồ sơ
  • Một đối tượng chó sau đó lớp Dog 

Ở đây, chúng ta đã sử dụng luồng xuất đối tượng để ghi đối tượng vào tệp. Và, luồng đầu vào đối tượng để đọc đối tượng từ tệp.

Lưu ý :lớp Dog thực hiện Serializable interface. Đó là vì ObjectOutputStream chỉ ghi các đối tượng có thể tuần tự hóa vào luồng đầu ra.

5. Các phương thức khác của ObjectInputStream

Phương thứcMô tả
available()trả về số byte có sẵn trong luồng đầu vào
mark()đánh dấu vị trí trong luồng đầu vào mà dữ liệu đã được đọc
reset()trả lại điều khiển về điểm trong luồng đầu vào nơi đặt dấu
skipBytes()bỏ qua và loại bỏ các byte được chỉ định khỏi luồng đầu vào
close()đóng luồng đầu vào đối tượng

Để tìm hiểu thêm, hãy truy cập Java ObjectInputStream (tài liệu Java chính thức) .

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!