zwei Files in eine File kopieren

Hallo und herzlich Willkommen onBoard.

Das kannst Du realisieren, indem Du nacheinander beide Dateien öffnest, ausliest und zwischenpufferst. Anschließend schreibst Du einfach den Puffer in eine Datei....
 
Hallo,

Das kannst Du realisieren, indem Du nacheinander beide Dateien öffnest, ausliest und zwischenpufferst

Zwischenpuffern ist etwas schlecht. Wenn die Dateien nämlich etwas größer sind, stößt man schnell an die Grenzen den Speichers.

Java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;


public class FileCopyExample
{
  
  public static void main(String[] args)throws Exception
  {
    FileInputStream fis1 = new FileInputStream("C:/test1.txt");
    FileInputStream fis2 = new FileInputStream("C:/test2.txt");
    
    FileChannel fic1 = fis1.getChannel();
    FileChannel fic2 = fis2.getChannel();
    
    FileOutputStream fos = new FileOutputStream("C:/test3.txt");
    
    FileChannel foc = fos.getChannel();
    


    copy(fic1, foc);
    copy(fic2, foc);
    
    fis1.close();
    fis2.close();
    
    fos.close();
  }
  
  private static void copy(FileChannel in, FileChannel out)throws Exception{
    long position = 0;
    long transfered;
    long remaining = in.size();
    
    while(remaining > 0){
      transfered = in.transferTo(position, remaining, out);
      
      position += transfered;
      remaining -= transfered;
    }
  }

}

MFG

zEriX
 
So kann man es auch machen.

Java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class FileCopyBufferExample
{

  public static void main(String[] args) throws Exception
  {
    FileInputStream fis1 = new FileInputStream("C:/test1.txt");
    FileInputStream fis2 = new FileInputStream("C:/test2.txt");

    FileOutputStream fos = new FileOutputStream("C:/test3.txt");

    copy(fis1, fos);
    copy(fis2, fos);

    fis1.close();
    fis2.close();

    fos.close();
  }

  private static void copy(InputStream in, OutputStream out) throws Exception
  {
    int length;
    byte[] buffer = new byte[8192];

    while ((length = in.read(buffer)) != -1)
    {
      out.write(buffer, 0, length);
    }
  }

}

MFG

zEriX
 
Hallo,

so gings auch:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 * @author Thomas.Darimont
 * 
 */
public class MergeFileContentExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        File inputFile = new File("c:/file1.txt");
        File anotherInputFile = new File("c:/file2.txt");
        File outputFile = new File("c:/mega_file.txt");

        mergeFilesInto(outputFile, inputFile, anotherInputFile);
    }

    /**
     * @param inputFile
     * @param anotherInputFile
     * @param outputFile
     * @throws IOException
     * @throws FileNotFoundException
     */
    private static void mergeFilesInto(File outputFile, File... inputFiles)
            throws IOException, FileNotFoundException {
        PrintWriter printWriter = new PrintWriter(new BufferedWriter(
                new FileWriter(outputFile)));

        for (File inputFile : inputFiles) {
            writeFileContentsTo(inputFile, printWriter);
        }

        printWriter.close();
    }

    /**
     * @param file
     * @param printWriter
     * @throws FileNotFoundException
     */
    private static void writeFileContentsTo(File file, PrintWriter printWriter)
            throws FileNotFoundException {
        Scanner inputScanner = new Scanner(file);

        while (inputScanner.hasNextLine()) {
            printWriter.println(inputScanner.nextLine());
        }

        inputScanner.close();
    }
}

ist IMHO leichter zu debuggen als mit FileChannel... wenn das zu langsam ist dann FileChannel.

Ansonsten:
Code:
C:\Dokumente und Einstellungen\Thomas.Darimont>type file1.dat file2.dat > mergedfile.dat
tuts auch...

Gruß Tom
 
Hallo,

die funktionieren sehr wohl... du machst mit Sicherheit was falsch. Mein Beispiel setzt voraus das du mindestens Java 5 hast und die Source files auch mit Sourcelevel 1.5 kompilierst.

Gruß Tom
 
Zurück