package javacodebook.io.splitfiles;

import java.io.*;
import java.util.Vector;

/**
 * Mit diesem Programm können die mit split aufgeteilten Dateien wieder
 * zusammengefügt werden.
 * Dazu wird der Dateiname des ersten Abschnitts angegeben. Es werden automatisch
 * alle Teile gesucht, die mit einer numerierten Endung versehen sind, und in
 * der richtigen Reihenfolge wieder zusammengefügt.
 * Zur Vereinfachung des Lesevorgangs wird der im Paket java.io verfügbare
 * SequenceInputStream benutzt, der eine Liste von Dateien erhält und alle
 * Dateien nacheinander einliest.
 */
public class MergeFiles {

    public static void merge(String firstFileName)
    throws IOException {
        //Zuerst wird die Basisdatei gesucht und überprüft, ob sie vorhanden
        //ist und gelesen werden kann
        File f = new File(firstFileName);
        if(!f.exists() || f.isDirectory() || !f.canRead())
            throw new IOException("Datei kann nicht zusammengefügt werden");

        //Alle Dateinamen müssen als Enumeration an den SequenceInputStream
        //übergeben werden
        Vector files = new Vector();
        files.addElement(new FileInputStream(f));
        int partNr = 1;
        String directory = f.getParent();
        String baseName = f.getName().substring(0, f.getName().lastIndexOf("."));
        String baseFile = directory + File.separator + baseName;
        String nextFileName = baseFile + "." + partNr;
        while((f = new File(nextFileName)).exists()) {
            files.addElement(new FileInputStream(f));
            partNr++;
            nextFileName = baseFile + "." + partNr;
        }
        SequenceInputStream in = new SequenceInputStream(files.elements());
        FileOutputStream out = new FileOutputStream(baseFile);
        int bytes = 0;
        byte[] buffer = new byte[4096];
        while((bytes = in.read(buffer)) > 0) {
            out.write(buffer,0, bytes);
        }
        in.close();
        out.close();
    }

    public static void main(String[] args) {
        if(args.length != 1)
            printUsage();
        try {
            String file = args[0];
            merge(file);
        }
        catch(Exception e) {
            e.printStackTrace(System.out);
        }
    }

    private static void printUsage() {
        System.out.println("Benutzung: java MergeFiles Dateiname_des_ersten_Abschnitts");
    }
}
