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

โปรแกรม Java รวมไฟล์ 2 ไฟล์ขึ้นไปสลับกันเป็นไฟล์เดียว

สมมติมีไฟล์ 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 - สลับบรรทัดจากแต่ละไฟล์ (ใช้ได้กับไฟล์ขนาดไม่เท่ากัน)