Input/output with files

ในบทนี้ คุณจะได้เรียนรู้การทำงานกับไฟล์ การอ่าน text file และการเขียนข้อมูลลงบน text file ในภาษา Java

นอกจากหน่วยความจำสำรอง (ram) ที่สามารถเก็บข้อมูลได้ชั่วคราว ยังมีการเก็บข้อมูลในรูปแบบไฟล์ในแหล่งเก็บข้อมูลภายนอก เช่น ฮาร์ดดิส ซึ่งในบางครั้งโปรแกรมต้องบันทึกข้อมูลเก็บไว้ในการใช้งานครั้งต่อไป หรืออ่านข้อมูลจากไฟล์มาประมวลผลในโปรแกรม ในบทเรียนนี้เราจะพูดเกี่ยวกับการใช้ภาษา Java เพื่อจัดการกับ text files ซึ่งเป็นไฟล์ประเภทพื้นฐาน

การอ่านข้อมูลจาก text files

ต่อไปเป็นตัวอย่างการอ่านค่าจาก text file ในภาษา Java ซึ่งเราจะใช้คลาส BufferedReader ในการอ่านจากไฟล์ทีละบรรทัดและแสดงผลออกทางหน้าจอ

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ReadFromFile {
    public static void main(String[] args) {  
        try {
            Path file = Paths.get("D:\\example.txt");
            BufferedReader reader = Files.newBufferedReader(file , 
                    StandardCharsets.UTF_8);
            String line = null;

            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            reader.close();
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
        }
    }
}

ในโค้ดข้างบนเป็นตัวอย่างของการอ่านไฟล์อย่างง่าย ในตอนแรกเราได้ทำการ import คลาสจากหลาย package เพื่อนำมาใช้ในโปรแกรมอ่านไฟล์ของเรา และประกาศตัวแปรที่ใช้ในการอ่านไฟล์โดยตัวแปร file เป็นพาธของไฟล์ในการอ่าน reader เป็นตัวแปรที่ใช้สำหรับอ่านไฟล์ และ line เป็นตัวแปรเก็บค่าชั่วคราวที่ผ่านมากจากไฟล์

reader = Files.newBufferedReader(file, StandardCharsets.UTF_8);  

ต่อมาเป็นการเปิดไฟล์เพื่ออ่าน ด้วยเมธอด Files.newBufferedReader() มันมีสองอากิวเมนต์คือพาธของไฟล์ และ charset ที่จะเปิดอ่านเราใช้เป็น StandardCharsets.UTF_8 เพื่อที่จะอ่านได้ทุกภาษา

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

นี่เป็นลูปในการอ่านไฟล์ โดยเมธอด reader.readLine() จะอ่านข้อมูลจากไฟล์ที่ละบรรทัด จนกว่าค่าที่ส่งกลับมาจะเป็น null ซึ่งหมายถึงสิ้นสุดของไฟล์ และนำมาไว้ในตัวแปร line และแสดงผลออกทางหน้าจอ

reader.close(); 

ในการเปิดไฟล์ทุกครั้ง จะต้องทำการปิดไฟล์เสมอโดยการใช้เมธอด close() เพื่อให้ไฟล์สามารถนำไปใช้ได้ในโปรแกรมอื่นต่อไป

Hello,
Welcome to MarcusCode tutorial
This is reading from text file example
This file has 4 lines

นี่เป็นผลลัพธ์เมื่อรันโปรแกรมที่อ่านไฟล์จาก D:/example.txt และผลลัพธ์ของคุณนั้นจะขึ้นกับข้อมูลในไฟล์ของคุณ

การเขียนข้อมูลลงบน text files

หลังจากที่ได้อ่านจากไฟล์แล้ว ต่อไปเป็นตัวอย่างในการเขียนข้อมูลลงไปบน text ไฟล์ ในภาษา Java เราจะใช้คลาส BufferedWriter ในการที่จะเขียนข้อมูลลงไปบนไฟล์

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class WriteToFile {
    public static void main(String[] args) {
        try {
            Path file = Paths.get("D:\\example2.txt");
            BufferedWriter writer = Files.newBufferedWriter(file, 
                    StandardCharsets.UTF_8);   

            for (int i = 0; i < 10; i++) {
                writer.write("This is content line " + (i + 1));
                writer.newLine();
            }

            writer.close();       
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
        }
    }
}

ในตัวอย่าง เป็นโปรแกรมเขียนข้อมูลลงไปใน text file โดยโปรแกรมจะเขียนข้อมูลลงไปในไฟล์ทีละบรรทัด ในตอนแรกเราได้ทำการ import package ที่จำเป็นในการใช้สำหรับการเขียนไฟล์

Path file = Paths.get("D:\\example2.txt");
BufferedWriter writer = Files.newBufferedWriter(file, 
                    StandardCharsets.UTF_8); 

เรากำหนดพาธของไฟล์ที่จะใช้ในการอ่าน และสร้างตัวแปรออบเจ็ค writer เพื่อที่จะเขียนไฟล์ โดยใส่อากิวเมนต์สองตัวคือพาธไฟล์และโหมดการเขียนที่เป็นแบบ UTF-8

for (int i = 0; i < 10; i++) {
    writer.write("This is content line " + (i + 1));
    writer.newLine();
}

นี่เป็นการใช้ลูปในการเขียนไฟล์ โดยเขียนลงไปทั้งหมด 10 บรรทัด เมธอด writer.write() เป็นเมธอดที่ใช้เขียนข้อความลงไปบนไฟล์ และเมธอด writer.newLine() เป็นการเขียนบรรทัดใหม่ลงไปบนไฟล์

writer.close(); 

เราปิดไฟล์ที่เปิดขึ้นมา เพื่อให้โปรแกรมอื่นสามารถนำไปใช้ได้ต่อไป

This is content line 1
This is content line 2
This is content line 3
This is content line 4
This is content line 5
This is content line 6
This is content line 7
This is content line 8
This is content line 9
This is content line 10

นี่เป็นข้อมูลในไฟล์ example2.txt ที่เราได้เขียนลงไป

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

BufferedWriter writer = Files.newBufferedWriter(file, 
                    StandardCharsets.UTF_8, StandardOpenOption.APPEND); 

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับวิธีการทำงานกับ text files ทั้งการอ่านข้อมูลจากไฟล์ และการเขียนข้อมูลลงไปบนไฟล์ในภาษา Java ซึ่งเป็นสิ่งที่จำเป็นในการเขียนโปรแกรม