In Java...

Lettore:
codice:
import java.io.*;

public class Lettore extends Thread {

   private Buffer buffer;
   private String nomeFile;
   private BufferedReader br;

   public Lettore(Buffer buffer, String nomeFile) {
      try {
         this.buffer = buffer;
         this.nomeFile = nomeFile;
         br = new BufferedReader( new InputStreamReader( new FileInputStream(nomeFile)) );
      } catch (Exception e) {}
   }

   public void run() {
      try {
         System.out.println("Inizio lettura file...");
         String linea;
         while ((linea = br.readLine()) != null) {
            buffer.scrivi(linea);
         }
         buffer.disattiva();
         System.out.println("Fine lettura file");
      } catch (Exception e) {}
   }
   
}
Scrittore:
codice:
import java.io.*;

public class Scrittore extends Thread {

   private Buffer buffer;
   private String nomeFile;
   private PrintStream ps;

   public Scrittore(Buffer buffer, String nomeFile) {
      try {
         this.buffer = buffer;
         this.nomeFile = nomeFile;
         ps = new PrintStream( new FileOutputStream(nomeFile) );
      } catch (Exception e) {}
   }

   public void run() {
      try {
         System.out.println("Inizio scrittura file...");
         String linea;
         while ((linea = buffer.leggi()) != null) {
            ps.println(linea);
         }
         ps.close();
         System.out.println("Fine scrittura file");
      } catch (Exception e) {}
   }
   
}
Buffer:
codice:
public class Buffer {
   private String [] linee = new String[5];  // Memorizzo al massimo 5 linee alla volta
   private int primaLineaLibera;
   private int primaLineaDaPrendere;
   private int numLinee;
   private boolean attivo;

   public Buffer() {
      primaLineaLibera = primaLineaDaPrendere = numLinee = 0;
      attivo = true;
   }

   public synchronized void scrivi(String linea) {
      while (numLinee == 5) {
         try {
            wait();
         } catch (Exception e) {}
      }
      linee[primaLineaLibera] = linea;
      primaLineaLibera = (primaLineaLibera + 1) % 5;
      numLinee++;
      notifyAll();
   }

   public synchronized String leggi() {
      String tmp = null;
      if (attivo || (numLinee > 0)) {
         while (numLinee == 0) {
            try {
               wait();
            } catch (Exception e) {}
         }
         tmp = linee[primaLineaDaPrendere];
         primaLineaDaPrendere = (primaLineaDaPrendere + 1) % 5;
         numLinee--;
         notifyAll();
      }
      return tmp;
   }

   public void disattiva() { attivo = false; }
}
Il programma principale:
codice:
public class Copia {
   public static void main(String [] args) {
      Buffer b = new Buffer();
      Lettore l = new Lettore(b, args[0]);
      Scrittore s = new Scrittore(b, args[1]);
      l.start();
      s.start();
   }
}
Come si usa:
codice:
$ java Copia {fileSorgente} {fileDestinazione}

{fileSorgente}: un file di testo
{fileDestinazione}: il nome del file da creare contenente la copia del file Sorgente
Dovrebbe funzionare...

Ciao.