โจทย์: อ่านไฟล์ทุกไฟล์ในโฟลเดอร์ รวมเขียนลงไฟล์เดียว
ตัวอย่างโค้ด (ปรับปรุง: 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: ไฟล์อาจเปลี่ยนระหว่างอ่าน