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.