Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java รวมเนื้อหาไฟล์ทั้งหมดใน Directory

โจทย์: อ่านไฟล์ทุกไฟล์ในโฟลเดอร์ รวมเขียนลงไฟล์เดียว

ตัวอย่างโค้ด (ปรับปรุง: try-with-resources, NIO.2)


import java.io.*;
import java.nio.file.*;
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        Path dir = Paths.get("path/to/input/directory");
        Path output = Paths.get("merged_output.txt");
        
        try (BufferedWriter writer = Files.newBufferedWriter(output)) {
            // ใช้ Files.list() + stream
            Files.list(dir)
                .filter(Files::isRegularFile)
                .sorted() // เรียงตามชื่อไฟล์
                .forEach(file -> {
                    try {
                        writer.write("=== Content from: " + file.getFileName() + " ===");
                        writer.newLine();
                        
                        // อ่านไฟล์เขียนทีละบรรทัด
                        Files.lines(file).forEach(line -> {
                            try {
                                writer.write(line);
                                writer.newLine();
                            } catch (IOException e) {
                                throw new UncheckedIOException(e);
                            }
                        });
                        
                        writer.newLine();
                    } catch (IOException e) {
                        throw new UncheckedIOException(e);
                    }
                });
            
            System.out.println("All files merged into: " + output);
        } catch (IOException e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

คำอธิบาย

  • ใช้ Files.list() + Stream API (Java 8+)
  • try-with-resources ปิด writer อัตโนมัติ
  • Files.lines() อ่านไฟล์เป็น stream ของบรรทัด (lazy, memory efficient)
  • UncheckedIOException ห่อ exception ใน lambda

รุ่นเก่า (Java 7-)


// ใช้ File.listFiles(), BufferedReader, BufferedWriter แบบ manual close
File dir = new File("path");
File[] files = dir.listFiles();
try (PrintWriter pw = new PrintWriter("output.txt")) {
    for (File f : files) {
        try (BufferedReader br = new BufferedReader(new FileReader(f))) {
            pw.println("=== " + f.getName() + " ===");
            String line;
            while ((line = br.readLine()) != null) {
                pw.println(line);
            }
        }
    }
}

ข้อควรระวัง

  • Encoding: ระบุ charset (UTF-8) ให้ชัดเจน
  • ไฟล์ใหญ่: ใช้ streaming (Files.lines) ไม่โหลดทั้งไฟล์เข้าหน่วยความจำ
  • Subdirectory: ใช้ Files.walk() แทน Files.list()
  • Concurrent modification: ไฟล์อาจเปลี่ยนระหว่างอ่าน