สมมติมีไฟล์ 3 ไฟล์:
// output1.txt
Hello how are you
// output2.txt
Welcome to Tutorialspoint
// output3.txt
We provide simply easy learning
ตัวอย่างที่ 1: รวม 3 ไฟล์เฉพาะเจาะจง (สลับบรรทัด)
import java.io.*;
import java.util.Scanner;
public class MergingFiles {
public static void main(String[] args) throws IOException {
Scanner sc1 = new Scanner(new File("D:\\input1.txt"));
Scanner sc2 = new Scanner(new File("D:\\input2.txt"));
Scanner sc3 = new Scanner(new File("D:\\input3.txt"));
FileWriter writer = new FileWriter("D:\\result.txt");
String[] lines = new String[3];
while (sc1.hasNextLine() || sc2.hasNextLine() || sc3.hasNextLine()) {
lines[0] = sc1.hasNextLine() ? sc1.nextLine() : "";
lines[1] = sc2.hasNextLine() ? sc2.nextLine() : "";
lines[2] = sc3.hasNextLine() ? sc3.nextLine() : "";
writer.append(lines[0]).append("\n");
writer.append(lines[1]).append("\n");
writer.append(lines[2]).append("\n");
}
writer.flush();
System.out.println("Contents merged alternately");
}
}
ตัวอย่างที่ 2: รวมไฟล์ทั้งหมดในโฟลเดอร์ (เรียงลำดับไฟล์)
import java.io.*;
import java.util.Scanner;
public class MergingFiles {
public static void main(String[] args) throws IOException {
File directoryPath = new File("D:\\example");
File[] filesList = directoryPath.listFiles();
FileWriter writer = new FileWriter("D:\\output.txt");
for (File file : filesList) {
if (file.isFile()) {
Scanner sc = new Scanner(file);
while (sc.hasNextLine()) {
writer.append(sc.nextLine()).append("\n");
}
writer.flush();
}
}
System.out.println("All files merged");
}
}
วิธีทันสมัย: Java NIO.2 + Stream (Java 8+)
import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;
public class MergeFilesModern {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("D:\\example");
Path output = Paths.get("D:\\output.txt");
try (Stream<Path> files = Files.list(dir).filter(Files::isRegularFile).sorted();
BufferedWriter writer = Files.newBufferedWriter(output)) {
for (Path file : files.toList()) {
try (Stream<String> lines = Files.lines(file)) {
lines.forEach(line -> {
try {
writer.write(line);
writer.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
}
}
}
System.out.println("Merged successfully");
}
}
ตัวอย่าง: รวมสลับกันแบบ Round-Robin (ไฟล์แต่ละไฟล์ 1 บรรทัด)
import java.io.*;
import java.nio.file.*;
import java.util.*;
public class RoundRobinMerge {
public static void main(String[] args) throws IOException {
List<Path> files = Arrays.asList(
Paths.get("D:\\input1.txt"),
Paths.get("D:\\input2.txt"),
Paths.get("D:\\input3.txt")
);
List<BufferedReader> readers = new ArrayList<>();
for (Path f : files) {
readers.add(Files.newBufferedReader(f));
}
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("D:\\result.txt"))) {
boolean anyLine;
do {
anyLine = false;
for (BufferedReader reader : readers) {
String line = reader.readLine();
if (line != null) {
writer.write(line);
writer.newLine();
anyLine = true;
}
}
} while (anyLine);
} finally {
for (BufferedReader r : readers) r.close();
}
}
}
สรุป
- Scanner + FileWriter - เข้าใจง่าย เหมาะ beginner
- Files.lines() + BufferedWriter - ทันสมัย จัดการ resource อัตโนมัติ
- Round-robin - สลับบรรทัดจากแต่ละไฟล์ (ใช้ได้กับไฟล์ขนาดไม่เท่ากัน)