Java คือ ตอนที่ 9 : File I/O และ Serialization

  1. ทำความเข้าใจเกี่ยวกับไฟล์ I/O ใน Java
    FileInputStream และ FileOutputStream
    BufferedInputStream และ BufferedOutputStream
  2. การทำให้เป็นอนุกรมของวัตถุ (Object Serialization)ใน Java
    การทำให้เป็นอนุกรมของวัตถุ (Serializing Objects)
    Deserializing Objects
  3. การทำแอพด้วย Java File I/O และ Serialization

ในการทำแอพ Java ที่ทรงพลัง ใช้งานได้จริง และมีประสิทธิภาพ การทำความเข้าใจไฟล์ Input/Output (I/O) และการทำให้เป็นอนุกรมของออบเจกต์ (Object Serialization) เป็นสิ่งสำคัญ ฟังก์ชันการทำงานเหล่านี้ทำให้การทำแอพของคุณสามารถอ่านและเขียนข้อมูลไปยังไฟล์และคงสถานะของออบเจกต์ในเซสชันต่างๆ ตามลำดับ ทักษะเหล่านี้สามารถเพิ่มประสิทธิภาพให้กับการทำแอพของคุณ ทำให้สามารถโต้ตอบกับฐานข้อมูล บันทึกการตั้งค่าผู้ใช้ ส่งออกและนำเข้าข้อมูล และอื่นๆ

1. ทำความเข้าใจเกี่ยวกับไฟล์ I/O ใน Java

Java ให้การสนับสนุนอย่างมากสำหรับการอ่านและเขียนไฟล์ผ่าน I/O API สองคลาสที่สำคัญใน API นี้คือ FileInputStream และ FileOutputStream

FileInputStream และ FileOutputStream

ลองมาดูตัวอย่างที่ใช้คลาสเหล่านี้กัน พิจารณาแอปพลิเคชันที่ต้องอ่านการกำหนดค่าผู้ใช้จากไฟล์ข้อความ:

import java.io.FileInputStream;
import java.io.IOException;

public class ConfigReader {
    public void readConfig(String fileName) {
        try (FileInputStream fis = new FileInputStream(fileName)) {
            int i;
            while ((i = fis.read()) != -1) {
                System.out.print((char) i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ที่นี่ FileInputStream ใช้เพื่ออ่านข้อมูลจากไฟล์ เมธอด read() จะส่งคืนข้อมูลไบต์ถัดไปหรือ -1 หากถึงจุดสิ้นสุดของไฟล์

ในการเขียนไฟล์เราใช้ FileOutputStream:

import java.io.FileOutputStream;
import java.io.IOException;

public class ConfigWriter {
    public void writeConfig(String fileName, String data) {
        try (FileOutputStream fos = new FileOutputStream(fileName)) {
            byte[] buffer = data.getBytes();
            fos.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ตัวอย่างนี้เขียนสตริงลงในไฟล์โดยใช้ FileOutputStream สตริงจะถูกแปลงเป็นไบต์ ซึ่งจะถูกเขียนลงในไฟล์

BufferedInputStream และ BufferedOutputStream

Java ยังมีสตรีม I/O ที่บัฟเฟอร์ – BufferedInputStream และBufferedOutputStream บัฟเฟอร์สามารถเพิ่มความเร็วในการดำเนินการ I/O เนื่องจากลดจำนวนครั้งที่เรียกการดำเนินการ I/O ดั้งเดิม

นี่คือตัวอย่างการใช้BufferedOutputStream:

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedWriter {
    public void writeData(String fileName, String data) {
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName))) {
            byte[] buffer = data.getBytes();
            bos.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. การทำให้เป็นอนุกรมของวัตถุ (Object Serialization)ใน Java

แม้ว่าไฟล์ I/O จะช่วยให้การทำแอพของคุณสามารถอ่านและเขียนข้อมูลลงในไฟล์ได้ แต่การทำให้เป็นอนุกรมของอ็อบเจ็กต์ (Object Serialization) จะช่วยให้คุณสามารถแปลงสถานะของอ็อบเจ็กต์เป็นไบต์สตรีม ซึ่งสามารถแปลงกลับเป็นสำเนาของอ็อบเจ็กต์ได้ เทคนิคนี้ช่วยให้การทำแอพของคุณสามารถคงอ็อบเจ็กต์ระหว่างเซสชัน ส่งอ็อบเจ็กต์ผ่านเครือข่าย หรือบันทึกลงในฐานข้อมูล

อินเทอร์เฟส Java Serializable ทำเครื่องหมายคลาสที่สามารถซีเรียลไลซ์ได้ ลองอธิบายสิ่งนี้ด้วยตัวอย่าง พิจารณาคลาส User:

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private String email;

    // constructors, getters, and setters...
}

การทำให้เป็นอนุกรมของวัตถุ (Serializing Objects)

ในการทำให้เป็นอนุกรมอินสแตนซ์ของคลาส User:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class UserSerializer {
    public void serializeUser(User user, String fileName) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
            oos.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Deserializing Objects

ในการดีซีเรียลไลซ์วัตถุ:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class UserDeserializer {
    public User deserializeUser(String fileName) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
            return (User) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3. การทำแอพด้วย Java File I/O และ Serialization

ด้วยทักษะเหล่านี้ ตอนนี้คุณสามารถปรับปรุงแอปพลิเคชันของคุณเพื่อสร้าง ดึงข้อมูล อัปเดต และลบไฟล์ (การดำเนินการ CRUD) ซึ่งจะทำให้ผู้ใช้ของคุณสามารถทำงานกับข้อมูลถาวรได้ ฟังก์ชันนี้สามารถนำไปใช้ในสถานการณ์จริงมากมาย เช่น การบันทึกการดำเนินการของผู้ใช้ การอ่าน/เขียนการตั้งค่าผู้ใช้ การส่งออก/นำเข้าข้อมูลไปยัง/จากไฟล์ CSV และอื่นๆ

นอกจากนี้ การทำให้เป็นอนุกรมของออบเจกต์ยังช่วยให้การทำแอพของคุณคงสถานะของออบเจกต์ระหว่างเซสชันได้ ซึ่งอาจมีความสำคัญสำหรับการทำแอพจำนวนมาก เช่น เกม ตัวจัดการรายการสิ่งที่ต้องทำ และโปรแกรมแก้ไขข้อความ


การทำความเข้าใจหัวข้อเหล่านี้เป็นขั้นตอนสำคัญในเส้นทางของคุณในการทำแอพ Java ทำให้คุณเข้าใกล้การทำแอพที่สามารถโต้ตอบกับระบบไฟล์และคงข้อมูลไว้ได้อย่างมีความหมาย จึงมอบคุณค่าที่มากขึ้นแก่ผู้ใช้ของคุณ

ฝึกฝนสิ่งที่คุณได้เรียนรู้ผ่านโครงการที่ลงมือปฏิบัติจริง เช่น การทำแอพเพื่อจัดการงานหรือโปรแกรมแก้ไขข้อความอย่างง่าย โปรดจำไว้ว่ากุญแจสำคัญในการเรียนรู้แนวคิดเหล่านี้อยู่ที่การนำไปใช้ ไม่ใช่แค่การเข้าใจทฤษฎีเท่านั้น


Java คืออะไร

Java คือ ตอนที่ 8 : โครงสร้างข้อมูล (Data Structures)
Java คือ ตอนที่ 10 : ไลบรารี (Libraries) และเฟรมเวิร์ก (Frameworks)