การอ่านและเขียนไฟล์ (File I/O)
วันนี้เรามาเรียนรู้เกี่ยวกับการอ่านและเขียนไฟล์ หรือ File I/O (Input/Output) ซึ่งเป็นทักษะสำคัญในการจัดการข้อมูลในโปรแกรม Java กัน
File I/O คืออะไร?
File I/O เป็นกระบวนการอ่านข้อมูลจากไฟล์ (Input) และเขียนข้อมูลลงในไฟล์ (Output) เปรียบเสมือนการอ่านและจดบันทึกในสมุด 📖✏️
ทำไม File I/O ถึงสำคัญ?
- เก็บข้อมูลถาวร: ข้อมูลยังอยู่แม้ปิดโปรแกรม
- แลกเปลี่ยนข้อมูล: ระหว่างโปรแกรมหรือระบบต่างๆ
- จัดการข้อมูลขนาดใหญ่: ที่ไม่สามารถเก็บในหน่วยความจำได้ทั้งหมด
การอ่านไฟล์
Java มีหลายวิธีในการอ่านไฟล์ แต่เราจะเริ่มจากวิธีที่ง่ายและปลอดภัยที่สุดโดยใช้ Files class:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class อ่านไฟล์ตัวอย่าง {
public static void main(String[] args) {
try {
List<String> บรรทัดทั้งหมด = Files.readAllLines(Paths.get("ข้อมูล.txt"));
for (String บรรทัด : บรรทัดทั้งหมด) {
System.out.println(บรรทัด);
}
} catch (IOException e) {
System.out.println("เกิดข้อผิดพลาดในการอ่านไฟล์: " + e.getMessage());
}
}
}การเขียนไฟล์
การเขียนไฟล์ก็สามารถทำได้ง่ายๆ ด้วย Files class เช่นกัน:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class เขียนไฟล์ตัวอย่าง {
public static void main(String[] args) {
List<String> บรรทัด = Arrays.asList("สวัสดี", "นี่คือการทดสอบ", "การเขียนไฟล์");
try {
Files.write(Paths.get("ผลลัพธ์.txt"), บรรทัด);
System.out.println("เขียนไฟล์เสร็จสิ้น");
} catch (IOException e) {
System.out.println("เกิดข้อผิดพลาดในการเขียนไฟล์: " + e.getMessage());
}
}
}การใช้ BufferedReader และ BufferedWriter
สำหรับไฟล์ขนาดใหญ่ การใช้ BufferedReader และ BufferedWriter จะมีประสิทธิภาพมากกว่า:
import java.io.*;
public class BufferedIOตัวอย่าง {
public static void main(String[] args) {
// การอ่านไฟล์
try (BufferedReader reader = new BufferedReader(new FileReader("ข้อมูล.txt"))) {
String บรรทัด;
while ((บรรทัด = reader.readLine()) != null) {
System.out.println(บรรทัด);
}
} catch (IOException e) {
System.out.println("เกิดข้อผิดพลาดในการอ่านไฟล์: " + e.getMessage());
}
// การเขียนไฟล์
try (BufferedWriter writer = new BufferedWriter(new FileWriter("ผลลัพธ์.txt"))) {
writer.write("สวัสดี\n");
writer.write("นี่คือการทดสอบ\n");
writer.write("การเขียนไฟล์ด้วย BufferedWriter");
} catch (IOException e) {
System.out.println("เกิดข้อผิดพลาดในการเขียนไฟล์: " + e.getMessage());
}
}
}การจัดการกับ Resources
การใช้ try-with-resources ช่วยให้เราไม่ต้องปิด resources ด้วยตัวเอง:
try (BufferedReader reader = new BufferedReader(new FileReader("ข้อมูล.txt"))) {
// โค้ดสำหรับอ่านไฟล์
} catch (IOException e) {
// จัดการข้อผิดพลาด
}เทคนิคและข้อควรระวัง
- ใช้ Path ที่ถูกต้อง: ตรวจสอบว่า path ของไฟล์ถูกต้องและมีสิทธิ์ในการเข้าถึง
- ปิด Resources เสมอ: ใช้
try-with-resourcesหรือปิด streams ในfinallyblock - จัดการ Exceptions: รับมือกับ
IOExceptionและ exceptions อื่นๆ ที่อาจเกิดขึ้น - ใช้ Buffering: สำหรับไฟล์ขนาดใหญ่ ใช้
BufferedReaderและBufferedWriter - เลือกใช้ Character Encoding ที่เหมาะสม: เช่น UTF-8 สำหรับการรองรับหลายภาษา
ตัวอย่างการใช้งานจริง: โปรแกรมบันทึกรายการสินค้า
มาดูตัวอย่างโปรแกรมที่ใช้ File I/O ในการบันทึกและอ่านรายการสินค้ากัน:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class โปรแกรมรายการสินค้า {
private static final String ชื่อไฟล์ = "รายการสินค้า.txt";
public static void main(String[] args) {
List<String> รายการสินค้า = อ่านรายการสินค้า();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n1. แสดงรายการสินค้า");
System.out.println("2. เพิ่มสินค้า");
System.out.println("3. ออกจากโปรแกรม");
System.out.print("เลือกตัวเลือก: ");
int ตัวเลือก = scanner.nextInt();
scanner.nextLine(); // ล้างบรรทัดว่าง
switch (ตัวเลือก) {
case 1:
แสดงรายการสินค้า(รายการสินค้า);
break;
case 2:
System.out.print("ใส่ชื่อสินค้า: ");
String สินค้าใหม่ = scanner.nextLine();
รายการสินค้า.add(สินค้าใหม่);
บันทึกรายการสินค้า(รายการสินค้า);
System.out.println("เพิ่มสินค้าเรียบร้อย");
break;
case 3:
System.out.println("ขอบคุณที่ใช้โปรแกรม");
return;
default:
System.out.println("ตัวเลือกไม่ถูกต้อง");
}
}
}
private static List<String> อ่านรายการสินค้า() {
List<String> รายการ = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(ชื่อไฟล์))) {
String บรรทัด;
while ((บรรทัด = reader.readLine()) != null) {
รายการ.add(บรรทัด);
}
} catch (IOException e) {
System.out.println("ไม่พบไฟล์รายการสินค้า จะสร้างไฟล์ใหม่");
}
return รายการ;
}
private static void บันทึกรายการสินค้า(List<String> รายการ) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(ชื่อไฟล์))) {
for (String สินค้า : รายการ) {
writer.write(สินค้า);
writer.newLine();
}
} catch (IOException e) {
System.out.println("เกิดข้อผิดพลาดในการบันทึกไฟล์: " + e.getMessage());
}
}
private static void แสดงรายการสินค้า(List<String> รายการ) {
if (รายการ.isEmpty()) {
System.out.println("ไม่มีสินค้าในรายการ");
} else {
System.out.println("รายการสินค้า:");
for (int i = 0; i < รายการ.size(); i++) {
System.out.println((i + 1) + ". " + รายการ.get(i));
}
}
}
}สรุป
File I/O เป็นทักษะสำคัญในการพัฒนาโปรแกรม Java ช่วยให้เราสามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพ ไม่ว่าจะเป็นการอ่าน เขียน หรือแก้ไขข้อมูลในไฟล์ การเข้าใจและใช้ File I/O อย่างถูกต้องจะช่วยให้คุณสามารถพัฒนาโปรแกรมที่จัดการข้อมูลได้อย่างยืดหยุ่นและมีประสิทธิภาพ